NiosII应用程序及其外设HAL驱动开发_第1页
NiosII应用程序及其外设HAL驱动开发_第2页
NiosII应用程序及其外设HAL驱动开发_第3页
NiosII应用程序及其外设HAL驱动开发_第4页
NiosII应用程序及其外设HAL驱动开发_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第,6,章,Nios II,应用程序及其外设,HAL,驱动开发,SOPC,嵌入式系统基础教程,哈尔滨理工大学,薛萍,本章首先简单介绍,Nios,II,IDE,开发环境的使用;然后重点介绍了,硬件抽象层,HAL,系统库,包括,HAL,下的应用程序开发以及开发,HAL,下,的设备驱动两部分内容;最后讲述了,MicroC/OS-II,实时操作系统及其应,用程序开发实例。本章还简单介绍了最新的,Nios,II,C,语言至硬件加速编,译器,主要内容,第,6,章,目录,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5

2、,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,6,章,目

3、录,6.1 Nios II IDE,简介,Nios II IDE,为软件开发提供,4,个主要功能,一、工程管理,二、编辑器和编译器,三、调试器,四、闪存编程器,统一开发平台,用于所有,Nios II,处理器系统,硬件抽象层系统库,HAL,轻量级,IP TCP/IP,库,uC/OS-II,实时操作系统,RTOS,Altera,压缩文件系统,一,工程管理器,1,新工程向导,2,软件工程模板,3,软件组件,6.1 Nios II IDE,简介,PIO,内核结构框图,对话框位置,File,New,C/C+ Application,工程模板,工程命名,指定硬件系统,模板功能介绍,二,编辑器和编译器,1,

4、文本编辑器,成熟的全功能源文件编辑器,包括:语法高亮显示,C/C,程序代,码、全面的搜索工具、文件管理、在线帮助和教程、快速定位及自动纠错,内置调试等功能,2,C/C,编译器,Nios,II,IDE,使用,GCC,编译器,并为其提供了一个图形化用户界面,图形化用户界面为,GCC,编译器提供了一个易用的按钮式流程,同时允,许开发人员手工设置高级编译选项,使得操作更简单方便,6.1 Nios II IDE,简介,三,调试器,软件调试器,GDB,是强大的、在,GNU,调试器基础之上的软件,调试器。该调试器提供许多基本调试功能以及一些在低成本处理器,开发套件中不会经常用到的高级调试功能,基本调试功能,

5、包括:运行控制、调用堆栈查看、软件断点、反,汇编代码查看、调试信息查看、指令集仿真器,高级调试功能,包括:硬件断点调试,ROM,或闪存中的代码、数据,触发、指令跟踪,6.1 Nios II IDE,简介,四,闪存编程器,多数使用,Nios,II,处理器的设计都需要采用闪存,Flash,来存,储,FPGA,配置数据和,或应用程序,Nios,II,IDE,提供了一个方便的,闪存编程方法。任何连接到,FPGA,的兼容通用闪存接口,CFI,的,闪存器件以及主动串行配置器件,EPCS,都可以通过,Nios,II,IDE,闪,存编程器来烧写,6.1 Nios II IDE,简介,6.1 Nios II I

6、DE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,6,章,目录,6.2,设置工程系统库属性和编译选项,对话框位置,右击,C/C,工程文件夹,System Library Properties,Debug,调试模式,Release,发布模式,C/C+ Build,设置,6.2,设置工程系统库属性和编译选项,对话

7、框位置,右击,C/C,工程文件夹,System Library Properties,C/C+ Indexer,编制程序文件索引,帮助用户方便地找到程序文件中的相关信息,问题报告的类型,帮助用户方便地定位错误,C/C+ Indexer,设置,6.2,设置工程系统库属性和编译选项,对话框位置,右击,C/C,工程文件夹,System Library Properties,System Library,设置,6.2,设置工程系统库属性和编译选项,对话框位置,右击,C/C,工程文件夹,System Library Properties,System Library,设置,RTOS,指定操作系统,RTO

8、S Options,对,RTOS,进行设置,Stdout,stderr,stdin,选择,Nios,II,系统的,C,标准输入,输出,设备,Null,可节省程序空间,System clock timer,系统时钟驱动所用的定时器,Timestamp timer,时间标记驱动所用的定时器,Max file descriptors,时间标记驱动所用的定时器,6.2,设置工程系统库属性和编译选项,对话框位置,右击,C/C,工程文件夹,System Library Properties,System Library,设置,用户自己创建和管理连接,建议,采用自动连接,Nios II IDE,自动创建和管

9、理连接,使用前必须指定下面选项,可执行代码驻留的物理存储器,只读数据驻留的物理存储器,可读,写数据驻留的物理存储器,Heap,堆,驻留的物理存储器,Stack,栈,驻留的物理存储器,选择后,异常堆栈将驻留在单独的物,理存储器中,指定异常堆栈驻留的物理存储器,指定异常堆栈的最大空间,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios I

10、I C,语言至硬件加速编译器,C2H,简介,第,6,章,目录,6.3,调试,运行程序,对话框位置,RUN,Debug /Debug As,选择,Debug,的目标器件,1,Nios II,硬件,2,Nios II,指令仿真器,3,Nios II,多处理器集,调试器目标连接设置,(Target Connection,6.3,调试,运行程序,对话框位置,RUN,Debug,Nios II Hardware,Target Connection,进行,JTAG,下载电缆的选择,进行连接在,JTAG,下载电缆上,带,JTAG,接口器件的选择,进行,Nios,II,系统中断通信工,具选择,调试器设置,(D

11、ebugger,6.3,调试,运行程序,对话框位置,RUN,Debug,Nios II Hardware,Debugger,调试器设置,(Debugger,视窗模式,6.3,调试,运行程序,Nios II IDE,切换到,Debug,视窗模式,运行程序,(Debugger,视窗模式,6.3,调试,运行程序,对话框位置,RUN,RUN /RUN As,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,

12、下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,6,章,目录,6.4,下载程序到,Flash,当调试工作完成并确保程序无错后,就可以把程序下载到,Flash,中了,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,

13、6,章,目录,6.5,硬件抽象层,HAL,系统库,嵌入式系统的软件开发可分为,2,部分,应用程序开发,用户软件开发的主要部分,包括系统的主程序,main(,和其它子程序,驱动程序,直接和底层硬件的宏定义打交道,6.5,硬件抽象层,HAL,系统库,HAL,的构成,HAL,系统库为用户提供下列支持,1,集成了,ANSI C,标准函数库,允许调用类似,C,标准库函数,2,提供访问,NiosII,系统每个设备的驱动程序,3,提供,HAL API,用于标准的函数接口如设备访问、中断处理以及,ALARM,等,4,提供系统初始化函数,为,main(,函数和,C,库函数建立运行时环境,5,提供设备初始化函数,

14、在,main(,函数前,分配设备空间并初始化所有的外围设备,Nios II HAL,的结构,6.5,硬件抽象层,HAL,系统库,HAL,的构成,Nios II HAL,的结构,6.5,硬件抽象层,HAL,系统库,HAL,的构成,HAL,支持以下几种通用的设备模型,1,字符型设备,2,文件子系统,3,DMA,设备,4,定时器设备,5,Flash,设备,6,以太网设备,6.5,硬件抽象层,HAL,系统库,HAL,的通用设备模型,Altera,提供的完整,HAL,支持的外围设备,1,字符型设备包括,UART,核,JTAG,核以及,LCD16207,显示控制器,2,文件子系统包括只读文档系统,3,DM

15、A,设备包括,DMA,控制器核,4,定时器设备包括定时器核,5,Flash,存储器设备包括通用,Flash,接口芯片和主动串行配置器件,EPCS,控制器,6,以太网设备包括,LAN9111,以太网,MAC/PHY,控制器并且需要,uC/OS-II,支持,7,还有一些第三方提供的外围设备,用户也可以定制字节的外围设备,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC

16、/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,6,章,目录,6.6,使用,HAL,开发应用程序,Nios II IDE,工程结构,Nios II IDE,工程结构,6.6,使用,HAL,开发应用程序,Nios II IDE,工程结构,一个,Nios II IDE,工程,用户工程文件夹,HAL,系统库文件夹,Nios II,设备驱动,6.6,使用,HAL,开发应用程序,与目标系统相关的,system.h,系统描述文件,System.h,文件构成过程,一部分描述系统,库的设置信息,另一部分给出了,每个外围设备的,详细信息,6.6,使用,HAL,开发应用程序,与

17、目标系统相关的,system.h,系统描述文件,程序清单,6.1 system.h,描述的,UART,设备,define,UART_NAME,dev/uart,UART,的设备名称及所在路径,open(,等文件操作函数可以通,过,UART_NAME,开打一个,UART,设备,define UART_TYPE altera_avalon_uart,描述了,UART,内核的类型,应用程序员可不关心,define UART_BASE 0 x00441480 /UART,设备的寄存器基地址,驱动程序可以根据该地址对,UART,寄存器进行访问,define UART_IRQ 1 / UART,设备的中断

18、号,系统据此判别中断来自,UART,设备,define UART_BAUD 115200,在系统生成过程中预设的串口波特率,define UART_DATA_BITS 8,描述,UART,数据帧长度,define UART_FIXED_BAUD 0,波特率是否软件可变的标志,define UART_PARITY N,是否能奇偶校验,define UART_STOP_BITS 1 / UART,数据包中停止位的宽度,define UART_USE_CTS_RTS 0,是否使用,CTS,和,RTS,信号,define UART_USE_EOP_REGISTER 0,是否生成了,EOP(End of

19、 Packet,寄存器,define UART_SIM_TRUE_BAUD 0,仿真时的波特率,define UART_SIM_CHAR_STREAM,仿真时的字符流,define UART_FREQ 48000000 / Avalon,总线的频率,48MHz,6.6,使用,HAL,开发应用程序,数据宽度及,HAL,类型定义,类型,说明,alt_8,有符号,8,位整数,alt_u8,无符号,8,位整数,alt_16,有符号,16,位整数,alt_u16,无符号,16,位整数,alt_32,有符号,32,位整数,alt_u32,无符号,32,位整数,类型,说明,char,8bits,short,

20、16bits,long,32bits,int,32bits,表,6.1 HAL,数据类型定义,表,6.2 Altera,提供的,GNU,编译器下的,ANSI C,数据类型宽度,6.6,使用,HAL,开发应用程序,HAL,对系统启动的支持,启动代码,用于系统上电复位后到运行,main(,函数前,初始化硬件,构建应用,程序运行时环境的过程。下面简单地叙述一下这段代码的完成的功能,上电或复位后的程序入口标号是,_reset,程序先对,CPU,进行初始化,1,初始化指令,Cache,然后调用,_start,2,初始化数据,Cache,把异常向量表装入指令,Cache,3,设置堆栈指针,Stack Po

21、inter,和全局指针,Global Pointer,寄存器,4,把全局变量和静态变量区,_bss_start _bss_end,清零,5,如果没有,bootloader,则把可读写数据,.rwdata,只读数据,.rodata,和异常向量表装入,RAM,中,6,调用,alt_main(,6.6,使用,HAL,开发应用程序,HAL,对系统启动的支持,HAL,提供默认执行的,alt_main(,对,CPU,及外设进行初始化,1,调用,ALT_OS_INIT(,初始化,OS,默认情况下完成对,uC/OS-II,的初始化,如果系统不使用操,作系统,则这步不执行,2,如果使用操作系统,则初始化访问,H

22、AL,提供的文件系统的信号量,alt_fd_list_lock,3,初始化中断控制器,开中断,4,调用,alt_sys_init(,初始化系统设备及软件模块,NiosII IDE,自动创建管理,alt_sys_init.c,5,把标准输入输出设备,stdin, stdout, stderr,映射到输入输出通道,I/O channel,上去,6,调用,C,的构造器,使用,the _do_ctors(,函数,7,登记,C,的解构器,8,调用,main,函数,6.6,使用,HAL,开发应用程序,HAL,与异常处理,当跳转到异常处理地址后,处理器开始执行一段由,HAL,插入的代码,判断中,断源和中断优

23、先级,然后再跳转到用户的中断服务子程序,ISR,异常处理过程和中断服务程序,6.6,使用,HAL,开发应用程序,HAL,与异常处理,当异常发生后,处理器会依次完成以下工作,1,把,status,寄存器内容复制到,estatus,寄存器中,保存当前处理器状态,如果是硬件中断,estatus,寄存器中的,EPIE,位置,1,2,清除,status,寄存器的,U,位为,0,强制处理器进入超级用户状态,3,清除,status,寄存器的,PIE,位为,0,禁止所有的硬件中断,4,把异常返回地址写入,ea,寄存器,r29,5,跳转到异常处理地址,6.6,使用,HAL,开发应用程序,HAL,与异常处理,为了

24、方便创建和维护中断服务程序,HAL,系统库提供了中断,API,函数如下所,示,int alt_irq_register(alt_u32 id,void* context,void (*isr)(void*, alt_u32),注册中断服务程序,int alt_irq_disable(alt_u32 id),禁止单个中断,int alt_irq_enable(alt_u32 id),使能单个中断,alt_irq_context alt_irq_disable_all(void),禁止所有中断,并返回一个,context,值,void alt_irq_enable_all(alt_irq_cont

25、ext context),使能所有中断,以,alt_irq_disable_all(,返回值作为输入参数,alt_u32 alt_irq_interruptible(alt_u32 priority),允许嵌套,void alt_irq_non_interruptible (alt_u32 mask),禁止嵌套,int alt_irq_enabled (void),检测中断的状态,如果有中断使能返回非,0,6.6,使用,HAL,开发应用程序,提高处理性能的措施,1,从软件上改善处理性能,1,把无关紧要的以及影响中断执行性能的事情放在中断服务程序之外处理,尽量使中断服务程序,精简,2,把传送大量

26、数据之类的事情交给,DMA,来完成,3,如果使用,DMA,传输大量数据,可以加大缓冲区以减少中断次数,从而提高中断性能,4,DMA,传输大量数据应用中,采用双缓冲区,5,在允许的情况下,一直保持中断使能,6,使用快速的存储空间来存储关键代码,7,使用中断嵌套,8,将应用程序工程和系统库工程都设置为高的编译优化等级,6.6,使用,HAL,开发应用程序,提高处理性能的措施,1,从硬件上改善处理性能,1,添加或加大快速存储器来存储关键代码或作为数据缓存,2,添加,DMA,控制器,这要与软件改善中的第,3.4,步同时执行,3,使用性能更好的,Nios II,处理器,如,Nios II/f,4,根据系统

27、实际的中断优先级来合理分配,SOPC Builder,系统中的中断号,注意,IRQ0,为最高优先,级,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,6,章,目录,6.7,设备驱动概述,设备寄存器抽象,控制寄存器,数据寄存器,状态寄存器,控制,部件,执行,部件,设备,读,写,驱动开

28、发人员眼中的设备,6.7,设备驱动概述,处理器外围设备的分类,字符型设备,以字符为单位进行传输的设备。比如字符终端,串口、鼠标等等,块设备,以数据块为单位进行传输的设备,比如,CF,卡,网络设备,是支持网络通信的设备。以包的形式传送,6.7,设备驱动概述,标准,I/O,访问方法,标准,I/O,访问方法就是标准,I/O,设备访问函数的集合。这些访问函数就是我们所熟知的,打开,Open,读,Read,写,Write,等,标准,I/O,函数,描,述,open,准备使用一个,I/O,设备,close,释放设备占用的资源,read,从一个,I/O,设备读数据,write,向一个,I/O,设备写数据,ls

29、eek,移动文件描述字的当前位置,fstat,获取一个打开的文件描述的文件信息,ioctl,设置,I/O,设备的操作参数,表,6.3,标准,I/O,设备访问函数,6.7,设备驱动概述,标准,I/O,函数到具体驱动程序的映射,应用,程序,open(,read(,write(,close(,lseek(,fstat(,ioctl(,具体,设备,Device_open(,Device_read(,Device_write(,Device_close(,Device_lseek(,Device_fstat(,Device_ioctl(,I/O,标准函数,设备驱动程序,标准,I/O,访问函数映射,6.7

30、,设备驱动概述,标准,I/O,函数到具体驱动程序的映射,Device_na,me,open,read,write,close,lseek,fstat,ioctl,my,my_open,my_read,my_write,my_close,my_lseek,my_fstat,my_ioctl,驱动函数,入口地址,表,6.4,驱动设备表,6.7,设备驱动概述,标准,I/O,函数到具体驱动程序的映射,程序清单,6.2,驱动设备表项,struct alt_dev_s,alt_llist llist;,用以链接设备表项,const char* name;,设备名,int (*open)(alt_fd* f

31、d, const char* name, int flags, int mode,int (*close)(alt_fd* fd,int (*read)(alt_fd* fd, char* ptr, int len,int (*write)(alt_fd* fd, const char* ptr, int len,int (*lseek)(alt_fd* fd, int ptr, int dir,int (*fstat)(alt_fd* fd, struct stat* buf,int (*ioctl)(alt_fd* fd, int req, void* arg,6.7,设备驱动概述,驱动程

32、序与设备交互的方法,轮询和中断,轮询方法,是指软件周期性查询硬件事件的发生,其驱动程序设计起来比较简单;缺点是,当有多个设备需要轮询时,由此带来的轮询开销是比较大的,而实时,性会降低,中断方式,是指外部事件发生后,打断正在处理的事件,进而去检查事件发生的原,因,最后做出相应的处理,可以提高,CPU,的利用率并可以保证系统具有较高的实时性能。在实时系统以及有多个外设的系统中,通常采用,中断方式与外设进行交互,6.7,设备驱动概述,调用设备驱动的方式,调用设备驱动通常有,3,种方式,1,应用程序直接调用,2,应用程序通过操作系统调用,3,应用程序通过操作系统的扩展,优点:高效访问设备,缺点:应用程

33、序与设备驱动直,接关联,可移植性变差,优点:高效访问设备,缺点:应用程序与设备驱动直,接关联,可移植性变差,优点:高效访问设备,缺点:应用程序与设备驱动直,接关联,可移植性变差,6.1 Nios II IDE,简介,6.2,设置工程系统库属性和编译选项,6.3,调试,运行程序,6.4,下载程序到,Flash,6.5,硬件抽象层,HAL,系统库,6.6,使用,HAL,开发应用程序,6.7,设备驱动概述,6.8,开发,HAL,下的设备驱动,6.9 MicroC/OS-II,6.10 Nios II C,语言至硬件加速编译器,C2H,简介,第,6,章,目录,6.8,开发,HAL,下的设备驱动,调驱动

34、程序的开发步骤,1,创建一个设备头文件,用于描述设备的寄存器和其访问方法,2,定义并实现设备驱动的功能,3,在,main(,中单独测试设备驱动的功能,4,把设备驱动集成到,HAL,中,6.8,开发,HAL,下的设备驱动,创建一个描述设备寄存器的头文件,1,文件名遵循,设备名,_regs.h,的格式,2,文件最后应该放置在,Nios II kit,安装路径,components,元件目录,inc,文件夹下,3,以,IORD_,设备名,_,寄存器名,的形式定义出寄存器的读访问方式,4,以,IOWR_,设备名,_,寄存器名,的形式定义出寄存器的写访问方式,5,以,设备名,_,寄存器名,_,位域,_M

35、SK,的形式定义出寄存器位的掩码,6,以,设备名,_,寄存器名,_,位域,_OFST,的形式定义出寄存器位的偏移位置,6.8,开发,HAL,下的设备驱动,为各类设备创建驱动程序,HAL,支持以下几种通用的设备模型,字符型设备,Character-mode devices,文件子系统,File subsytems,DMA,设备,DMA devices,用作系统时钟的定时器设备,Timer devices used as system clock,用,作,时,间,标,记,的,定,时,器,设,备,Timer,devices,used,as,timestamp,clock,Flash,设备,Flash

36、 memory devices,以太网设备,Ethernet devices,下面将叙述各类设备驱动的实现方法及如何它们注册,register,到,HAL,系统中去,6.8,开发,HAL,下的设备驱动,为各类设备创建驱动程序,1,字符型设备,把字符型虚拟设备具体化,实现设备的具体操作,向,HAL,注册字符设备,6.8,开发,HAL,下的设备驱动,把字符型虚拟设备具体化,程序清单,6.3,字符型设备结构体定义,* Nios II kit,安装路径,componentsaltera_halHALincsysalt_dev.h,文件中定义,struct alt_dev_s,alt_llist lli

37、st; /* for internal use *,const char* name,int (*open) (alt_fd* fd, const char* name, int flags, int mode,int (*close) (alt_fd* fd,int (*read) (alt_fd* fd, char* ptr, int len,int (*write) (alt_fd* fd, const char* ptr, int len,int (*lseek) (alt_fd* fd, int ptr, int dir,int (*fstat) (alt_fd* fd, struc

38、t stat* buf,int (*ioctl) (alt_fd* fd, int req, void* arg,typedef struct alt_dev_s alt_dev,这个结构体表达的意思是,字符型设备有这样的共性:它们都有一个以字符串形式表达的名字,name,都支持,open,close,read,write,lseek,fstat,ioctl,操作中的一种或几种,6.8,开发,HAL,下的设备驱动,把字符型虚拟设备具体化,程序清单,6.4 alt_fd,类型定义,typedef struct alt_fd_s,alt_dev* dev,alt_u8* priv,int fd_f

39、lags,alt_fd,Dev,是指向设备类型结构体的指针,Priv,供驱动程序内部使用,Fd_flags,传递文件处理标志,6.8,开发,HAL,下的设备驱动,把字符型虚拟设备具体化,程序清单,6.4,描述,uART,设备的结构体,typedef struct,alt_dev dev,void* base,alt_u32 ctrl,alt_u32 rx_start,volatile alt_u32 rx_end,volatile alt_u32 tx_start,alt_u32 tx_end,ifdef ALTERA_AVALON_UART_USE_IOCTL,struct termios

40、termios,alt_u32 freq,endif,alt_u32 flags,ALT_FLAG_GRP(events,ALT_SEM(read_lock,ALT_SEM(write_lock,alt_u8 rx_bufALT_AVALON_UART_BUF_LEN,alt_u8 tx_bufALT_AVALON_UART_BUF_LEN,alt_avalon_uart_dev,6.8,开发,HAL,下的设备驱动,把字符型虚拟设备具体化,void func(alt_dev* dev,alt_avalon_uart_dev * uart_dev = (alt_avalon_uart_dev *

41、) dev,6.8,开发,HAL,下的设备驱动,把字符型虚拟设备具体化,上面定义出了,UART,设备的数据类型,但是内存空间中还没有真正描述,UART,设备的数据域,接下来把,UART,设备实例化,程序清单,6.4,描述,uART,设备的结构体,见下页,6.8,开发,HAL,下的设备驱动,程序清单,6.4,描述,uART,设备的结构体,define ALTERA_AVALON_UART_INSTANCE(name, dev,static alt_avalon_uart_dev dev,ALT_LLIST_ENTRY,name#_NAME,NULL, /* open *,NULL, /* clo

42、se *,alt_avalon_uart_read,alt_avalon_uart_write,NULL, /* lseek *,NULL, /* fstat *,ALTERA_AVALON_UART_IOCTL,void*) name#_BASE,0,0,0,0,0,ALTERA_AVALON_UART_TERMIOS(name#_STOP_BITS,name#_PARITY = N,name#_PARITY = O,name#_DATA_BITS,name#_USE_CTS_RTS,name#_BAUD,ALTERA_AVALON_UART_FREQ(name,name#_FIXED_BA

43、UD ? ALT_AVALON_UART_FB : 0) ,name#_USE_CTS_RTS,ALT_AVALON_UART_FC,0,6.8,开发,HAL,下的设备驱动,实现设备的具体操作,上一步中,已经获得了设备的属性,也把访问函数地址填入相应的函数指针,接下来的工作就是实现这些函数。实现这些函数例子见,UART,的实现文件,Nios II kit,安装路径,componentsaltera_avalon_uartHALsrcaltera_avalon_uart.c,6.8,开发,HAL,下的设备驱动,向,HAL,注册,Register,字符设备,方法:在设备的初始化函数中调用字符设备驱

44、动注册函数,注册函数返回负数表示注册失败,非负数,0,和正数,表示操作成功。所以,只,须检测返回值是否小于零,即可知道是否操作成功。例如,int alt_dev_reg(alt_dev* dev,define ENODEV 50,int func,err = -ENODEV,return err,6.8,开发,HAL,下的设备驱动,为各类设备创建驱动程序,2,文件子系统,HAL,已经提供了一个文件系统,当把一个新的设备挂载到,HAL,文件系统的某个点上时,可以用文件的方式来管理和操作它,把文件子系统型虚拟设备具体化,实现设备的具体操作,向,HAL,注册文件子系统,6.8,开发,HAL,下的设备

45、驱动,为各类设备创建驱动程序,3,Flash,设备,把,Flash,型虚拟设备具体化,6.8,开发,HAL,下的设备驱动,程序清单,6.7 Flash,型虚拟设备结构体定义,struct alt_flash_dev,alt_llist llist,const char* name,alt_flash_open open,alt_flash_close close,alt_flash_write write,alt_flash_read read,alt_flash_get_flash_info get_info,alt_flash_erase_block erase_block,alt_fla

46、sh_write_block write_block,void* base_addr; /flash,的基地址,int length; /flash,的容量大小,单位为字节,int number_of_regions; /flash,中可擦除区的数量,flash_region region_infoALT_MAX_NUMBER_OF_FLASH_REGIONS,6.8,开发,HAL,下的设备驱动,程序清单,6.8,具体,Flash,设备的数据结构定义,struct alt_flash_cfi_dev,alt_flash_dev dev,int algorithm,int mode_width,

47、int device_width,int write_timeout,int erase_timeout,int primary_address,* Flash type specific functions to access the flash and perform various operations *,alt_write_command_fn write_command,alt_read_query_fn read_query,alt_write_native_fn write_native,6.8,开发,HAL,下的设备驱动,为各类设备创建驱动程序,3,Flash,设备,实现,F

48、lash,设备的具体操作,现,Flash,设备的具体操作。从,Flash,型虚拟设备结构体定义,中,我们可以知道,对于,Flash,型设备需要实现,7,种访问方法,它们是,1,alt_flash_open(,2,alt_flash_close(,3,alt_flash_write(,4,alt_flash_read(,5,alt_flash_get_flash_info(,6,alt_flash_erase_block(,7,alt_flash_write_block(,6.8,开发,HAL,下的设备驱动,为各类设备创建驱动程序,3,Flash,设备,向,HAL,注册,Flash,设备,注册方

49、法同字符设备,唯一不同是需要调用,Flash,设备注册函数,注册函数返回,0,表示注册成功,返回一个负数表示注册失败,int alt_flash_device_register(alt_flash_fd* dev,6.8,开发,HAL,下的设备驱动,为各类设备创建驱动程序,4,以太网设备,Altera,提供了,SMSC lan91c111,器件的驱动,因此用户如果想使用不同厂,家的以太网芯片,编写驱动的一种简便的方法就是在,lan91c111,驱动的基础,上,进,行,修,改,lan91c111,的,驱,动,位,于,Nios,II,kit,安,装,路,径,alterakitsnios2compo

50、nentsaltera_avalon_lan91c111,文,件,夹,中,剩下的三种设备,DMA,设备、用作系统时钟的定时器设备、用作时间标记,的定时器设备,Altera,已经为用户实现了,所以这里就不再鏊述了,6.8,开发,HAL,下的设备驱动,把设备驱动集成到,HAL,中,1,放置驱动程序,驱动程序开发完毕后,还需要把源程序文件放到约定的,SRC,文件夹下,并在此文件夹下为它编写一个简单的,Makefile,文件,以便于工程的管理,和编译,所有驱动都,应该,放置在,components,目录下,集成到,HAL,系统库,中的,设备驱动,文,件放在,HAL,目录,放,置,设,备,寄,存,器,描

51、,述,文,件,6.8,开发,HAL,下的设备驱动,把设备驱动集成到,HAL,中,2,编写,Makefile,文件,程序清单,6.10 Makefile,的基本格式, List all source files supplied by this component,C_LIB_SRCS += altera_avalon_uart.c,ASM_LIB_SRCS +,INCLUDE_PATH +,欲编译的,C,文件放置在,C_LIB_SRCS,一行,欲编译的汇编文件放置在,ASM_LIB_SRCS,一行,欲增加包含文件的路径,把路径加在,INCLUDE_PATH,一行,多个文件之间和多个路径之间用空

52、格分开,6.8,开发,HAL,下的设备驱动,把设备驱动集成到,HAL,中,3,设备头文件编写,找到设备头文件后,编译器会在,alt_sys_init.c,文件中插入下面一些代码,包含该设备的头文件,插入为该设备分配存储空间的宏定义,_INSTANCE,在,初,始,化,函,数,alt_sys_init(,中,插,入,初,始,化,设,备,的,宏,定,义,name,of,device_INIT,6.8,开发,HAL,下的设备驱动,程序清单,6.11 alt_sys_init.c,的片段,include system.h,include sys/alt_sys_init.h,* device head

53、ers*,include altera_avalon_timer.h,include altera_avalon_uart.h,* Allocate the device storage*,ALTERA_AVALON_UART_INSTANCE( UART1, uart1,ALTERA_AVALON_TIMER_INSTANCE( SYSCLK, sysclk,* Initialise the devices*,void alt_sys_init( void,ALTERA_AVALON_UART_INIT( UART1, uart1,ALTERA_AVALON_TIMER_INIT( SYSCLK, sysclk,6.8,开发,HAL,下的设备驱动,把设备驱动集成到,HAL,中,3,设备头文件编写,设备头文件的格式,设备头文件名要与,SOPC Builder,中对应的组件名一致,在设备头文件中以,_INSTANCE,的形式定义一个设备实例,化的宏,在设备头文件中以,_INIT,的形式定义一个设备初始化的宏,6.8,开发,HAL,下的设备驱动,程序清单,6.12 alter_avalon_uart,设备的实例化宏,Nios II kit,安装路径,componentsaltera_avalon_uartHALinc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论