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

下载本文档

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

文档简介

1、第第6 6章章 Nios II Nios II应用程序及其应用程序及其外设外设HALHAL驱动开发驱动开发6.1 Nios II IDE简介Nios II IDE为软件开发提供4个主要功能:一、工程管理一、工程管理二、编辑器和编译器二、编辑器和编译器三、调试器三、调试器四、闪存编程器四、闪存编程器统一开发平台,用于所有Nios II处理器系统。n硬件抽象层系统库HALn轻量级IP TCP/IP库nuC/OS-II实时操作系统RTOSnAltera压缩文件系统一工程管理器1.新工程向导2.软件工程模板3.软件组件6.1 Nios II IDE简介PIO内核结构框图(对话框位置:对话框位置:Fil

2、eNewC/C+ Application )工程模板工程命名指定硬件系统模板功能介绍二编辑器和编译器1.文本编辑器成熟的全功能源文件编辑器,包括:语法高亮显示C/C+程序代码、全面的搜索工具、文件管理、在线帮助和教程、快速定位及自动纠错、内置调试等功能。2.C/C+编译器Nios II IDE使用GCC编译器,并为其提供了一个图形化用户界面。图形化用户界面为GCC编译器提供了一个易用的按钮式流程,同时允许开发人员手工设置高级编译选项,使得操作更简单方便。6.1 Nios II IDE简介三调试器四软件调试器(GDB):是强大的、在GNU调试器根底之上的软件调试器。该调试器提供许多根本调试功能以

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

4、Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7 设备驱动概述n6.8 开发HAL下的设备驱动n6.9 MicroC/OS-IIn6.10 Nios II C语言至硬件加速编译器(C2H)简介第6章 目录6.2 设置工程系统库属性和编译选项(对话框位置:对话框位置:右击右击C/C+工程文件夹工程文件夹System Library Properties )Debug:调试模式Release:发布模式nC/C+ Build 设置6.2 设置工程系统库属

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

6、 Properties )nSystem Library 设置RTOS:指定操作系统。RTOS Options:对RTOS进行设置。Stdout、stderr、stdin:选择Nios II 系统的C标准输入/输出设备。Null可节省程序空间。System clock timer:系统时钟驱动所用的定时器。Timestamp timer:时间标记驱动所用的定时器。Max file descriptors:时间标记驱动所用的定时器。6.2 设置工程系统库属性和编译选项( 对话框位置:对话框位置:右击右击C/C+工程文件夹工程文件夹System Library Properties )nSyste

7、m Library 设置用户自己创立和管理连接,建议采用自动连接。Nios II IDE自动创立和管理连接,使用前必须指定下面选项。n可执行代码驻留的物理存储器。n只读数据驻留的物理存储器。n可读/写数据驻留的物理存储器。nHeap(堆)驻留的物理存储器。nStack(栈)驻留的物理存储器。选择后,异常堆栈将驻留在单独的物理存储器中。n指定异常堆栈驻留的物理存储器。n指定异常堆栈的最大空间。n6.1 Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7

8、 设备驱动概述n6.8 开发HAL下的设备驱动n6.9 MicroC/OS-IIn6.10 Nios II C语言至硬件加速编译器(C2H)简介第6章 目录6.3 调试/运行程序(对话框位置:对话框位置:RUNDebug /Debug As)选择Debug的目标器件:1.Nios II硬件硬件2.Nios II指令仿真器指令仿真器3.Nios II多处理器集多处理器集n调试器目标连接设置-(Target Connection)6.3 调试/运行程序(对话框位置:对话框位置:RUNDebug Nios II Hardware Target Connection)n进行JTAG下载电缆的选择。n进

9、行连接在JTAG下载电缆上带JTAG接口器件的选择。n进行Nios II系统中断通信工具选择。n调试器设置-(Debugger)6.3 调试/运行程序(对话框位置:对话框位置:RUNDebug Nios II Hardware Debugger)n调试器设置-(Debugger 视窗模式)6.3 调试/运行程序(Nios II IDE 切换到切换到Debug视窗模式视窗模式)n运行程序-(Debugger 视窗模式)6.3 调试/运行程序(对话框位置:对话框位置:RUNRUN /RUN As)n6.1 Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6

10、.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7 设备驱动概述n6.8 开发HAL下的设备驱动n6.9 MicroC/OS-IIn6.10 Nios II C语言至硬件加速编译器(C2H)简介第6章 目录6.4 下载程序到Flash当调试工作完成并确保程序无错后,就可以把程序下载到Flash中了。n6.1 Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7 设备驱动概述n6.8 开发HAL下的设

11、备驱动n6.9 MicroC/OS-IIn6.10 Nios II C语言至硬件加速编译器(C2H)简介第6章 目录6.5 硬件抽象层(HAL)系统库嵌入式系统的软件开发可分为2局部:应用程序开发:用户软件开发的主要局部,包括系统的主程序main()和其它子程序。驱动程序:直接和底层硬件的宏定义打交道。6.5 硬件抽象层(HAL)系统库nHAL的构成nHAL系统库为用户提供以下支持:n集成了ANSI C标准函数库,允许调用类似C标准库函数;n提供访问NiosII系统每个设备的驱动程序;n提供HAL API,用于标准的函数接口如设备访问、中断处理以及ALARM等;n提供系统初始化函数,为main

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

13、;3.DMA设备包括DMA控制器核;4.定时器设备包括定时器核;5.Flash存储器设备包括通用Flash接口芯片和主动串行配置器件EPCS控制器。6.以太网设备包括LAN9111以太网MAC/PHY控制器并且需要uC/OS-II支持。7.还有一些第三方提供的外围设备,用户也可以定制字节的外围设备。n6.1 Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7 设备驱动概述n6.8 开发HAL下的设备驱动n6.9 MicroC/OS-IIn6.10 N

14、ios II C语言至硬件加速编译器(C2H)简介第6章 目录6.6 使用HAL开发应用程序 nNios II IDE 工程结构Nios II IDE工程结构6.6 使用HAL开发应用程序 nNios II IDE 工程结构一个Nios II IDE工程用户工程文件夹HAL系统库文件夹Nios II设备驱动6.6 使用HAL开发应用程序 n与目标系统相关的系统描述文件文件构成过程一局部描述系统库的设置信息;另一局部给出了每个外围设备的相信信息;6.6 使用HAL开发应用程序 n与目标系统相关的系统描述文件程序清单描述的UART设备#define UART_NAME /dev/uart /UAR

15、T的设备名称及所在路径,open()等文件操作函数可以通/过UART_NAME开打一个UART设备#define UART_TYPE altera_avalon_uart /描述了UART内核的类型,应用程序员可不关心#define UART_BASE 0 x00441480 /UART设备的存放器基地址,驱动程序可以根据该地址对/UART存放器进行访问#define UART_IRQ 1 / UART设备的中断号,系统据此判别中断来自UART设备#define UART_BAUD 115200 / 在系统生成过程中预设的串口波特率#define UART_DATA_BITS 8 / 描述UA

16、RT数据帧长度#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 Packet)存放器#define UART_SIM_TRUE_BAUD 0 /仿真时的波特率#define UART_SIM_CHAR_STREAM /仿真时的字符流#define

17、UART_FREQ 48000000 / Avalon总线的频率,48MHz6.6 使用HAL开发应用程序 n数据宽度及HAL类型定义类型说明alt_8有符号8位整数alt_u8无符号8位整数alt_16有符号16位整数alt_u16有符号16位整数alt_32无符号32位整数alt_u32有符号32位整数类型说明char8bitsshort16bitslong32bitsint32bits表6.1 HAL数据类型定义表6.2 Altera提供的GNU编译器下的ANSI C数据类型宽度6.6 使用HAL开发应用程序 nHAL对系统启动的支持n启动代码用于系统上电复位后到运行main()函数前,

18、初始化硬件,构建应用程序运行时环境的过程。下面简单地表达一下这段代码的完成的功能:n上电或复位后的程序入口标号是“_reset,程序先对CPU进行初始化:n初始化指令Cache,然后调用_start;n初始化数据Cache,把异常向量表装入指令Cache;n设置堆栈指针(Stack Pointer)和全局指针(Global Pointer)存放器;n把全局变量和静态变量区(_bss_start _bss_end)清零;n如果没有bootloader,那么把可读写数据(.rwdata),只读数据(.rodata)和异常向量表装入RAM中;n调用alt_main()。6.6 使用HAL开发应用程序

19、 nHAL对系统启动的支持nHAL提供默认执行的alt_main()对CPU及外设进行初始化:n调用ALT_OS_INIT()初始化OS:默认情况下完成对uC/OS-II的初始化,如果系统不使用操作系统,那么这步不执行。n如果使用操作系统,那么初始化访问HAL提供的文件系统的信号量alt_fd_list_lock。n初始化中断控制器,开中断。n调用alt_sys_init()初始化系统设备及软件模块,NiosII IDE自动创立管理。n把标准输入输出设备(stdin, stdout, stderr)映射到输入输出通道I/O channel上去;n调用C+的构造器,使用the _do_ctors

20、()函数。n登记C+的解构器;n调用main函数。6.6 使用HAL开发应用程序 nHAL与异常处理n当跳转到异常处理地址后,处理器开始执行一段由HAL插入的代码,判断中断源和中断优先级,然后再跳转到用户的中断效劳子程序(ISR)异常处理过程和中断效劳程序6.6 使用HAL开发应用程序 nHAL与异常处理n当异常发生后,处理器会依次完成以下工作:n把status存放器内容复制到estatus存放器中,保存当前处理器状态,如果是硬件中断,estatus存放器中的EPIE位置1;n去除status存放器的U位为0,强制处理器进入超级用户状态;n去除status存放器的PIE位为0,禁止所有的硬件中

21、断;n把异常返回地址写入ea存放器r29;n跳转到异常处理地址。6.6 使用HAL开发应用程序 nHAL与异常处理n为了方便创立和维护中断效劳程序,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) /禁止

22、所有中断,并返回一个context 值void alt_irq_enable_all(alt_irq_context 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) /检测中断的状态,如果有中断使能返回非06.6 使用HAL开发应用程序 n提高处理性能的措施n(1)从软件上改善处理性能n把

23、无关紧要的以及影响中断执行性能的事情放在中断效劳程序之外处理,尽量使中断效劳程序精简;n把传送大量数据之类的事情交给DMA来完成;n如果使用DMA传输大量数据,可以加大缓冲区以减少中断次数,从而提高中断性能。nDMA传输大量数据应用中,采用双缓冲区;n在允许的情况下,一直保持中断使能。n使用快速的存储空间来存储关键代码;n使用中断嵌套n将应用程序工程和系统库工程都设置为高的编译优化等级。6.6 使用HAL开发应用程序 n提高处理性能的措施(1)从硬件上改善处理性能1.添加或加大快速存储器来存储关键代码或作为数据缓存。2.添加DMA控制器,这要与软件改善中的第步同时执行。3.使用性能更好的Nio

24、s II处理器,如Nios II/f。4.根据系统实际的中断优先级来合理分配SOPC Builder系统中的中断号,注意IRQ0为最高优先级。n6.1 Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7 设备驱动概述n6.8 开发HAL下的设备驱动n6.9 MicroC/OS-IIn6.10 Nios II C语言至硬件加速编译器(C2H)简介第6章 目录6.7 设备驱动概述n设备存放器抽象驱动开发人员眼中的设备6.7 设备驱动概述n处理器外围设备的

25、分类字符型设备:以字符为单位进行传输的设备。比方字符终端、串口、鼠标等等。块设备:以数据块为单位进行传输的设备,比方CF卡。网络设备:是支持网络通信的设备。以包的形式传送。6.7 设备驱动概述n标准I/O访问方法n标准I/O访问方法就是标准I/O设备访问函数的集合。这些访问函数就是我们所熟知的翻开(Open)、读(Read)、写(Write)等。标准I/O函数描 述open准备使用一个I/O设备close释放设备占用的资源read从一个I/O设备读数据write向一个I/O设备写数据lseek移动文件描述字的当前位置fstat获取一个打开的文件描述的文件信息ioctl设置I/O设备的操作参数表

26、6.3 标准I/O设备访问函数6.7 设备驱动概述n标准I/O函数到具体驱动程序的映射标准I/O访问函数映射6.7 设备驱动概述n标准I/O函数到具体驱动程序的映射Device_nameopenreadwritecloselseekfstatioctl“my”my_openmy_readmy_writemy_closemy_lseekmy_fstatmy_ioctl 驱动函数入口地址表6.4 驱动设备表6.7 设备驱动概述n标准I/O函数到具体驱动程序的映射程序清单6.2 驱动设备表项struct alt_dev_s alt_llist llist; /用以链接设备表项 const char*

27、 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, struct stat* buf); int (*ioctl)(

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

29、过操作系统调用;3.应用程序通过操作系统的扩展。优点:高效访问设备;缺点:应用程序与设备驱动直接关联,可移植性变差。优点:高效访问设备;缺点:应用程序与设备驱动直接关联,可移植性变差。优点:高效访问设备;缺点:应用程序与设备驱动直接关联,可移植性变差。n6.1 Nios II IDE简介n6.2 设置工程系统库属性和编译选项n6.3 调试/运行程序n6.4 下载程序到Flashn6.5 硬件抽象层(HAL)系统库n6.6 使用HAL开发应用程序 n6.7 设备驱动概述n6.8 开发HAL下的设备驱动n6.9 MicroC/OS-IIn6.10 Nios II C语言至硬件加速编译器(C2H)简

30、介第6章 目录6.8 开发HAL下的设备驱动调驱动程序的开发步骤:创立一个设备头文件,用于描述设备的存放器和其访问方法;定义并实现设备驱动的功能;在main()中单独测试设备驱动的功能;把设备驱动集成到HAL中。6.8 开发HAL下的设备驱动n创立一个描述设备存放器的头文件n文件名遵循设备名的格式;n文件最后应该放置在: componentsinc文件夹下;n以IORD_的形式定义出存放器的读访问方式;n以IOWR_的形式定义出存放器的写访问方式;n以_MSK的形式定义出存放器位的掩码;n以_OFST的形式定义出存放器位的偏移位置。6.8 开发HAL下的设备驱动n为各类设备创立驱动程序nHAL

31、支持以下几种通用的设备模型:n字符型设备(Character-mode devices)n文件子系统(File subsytems)nDMA设备(DMA devices)n用作系统时钟的定时器设备(Timer devices used as system clock)n用作时间标记的定时器设备(Timer devices used as timestamp clock)nFlash设备(Flash memory devices)n以太网设备(Ethernet devices)n下面将表达各类设备驱动的实现方法及如何它们注册register到HAL系统中去。6.8 开发HAL下的设备驱动n为各类

32、设备创立驱动程序n字符型设备n 把字符型虚拟设备具体化n 实现设备的具体操作n 向HAL注册字符设备6.8 开发HAL下的设备驱动 把字符型虚拟设备具体化程序清单6.3 字符型设备结构体定义/* 文件中定义*/struct alt_dev_s alt_llist llist; /* 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, cha

33、r* 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);typedef struct alt_dev_s alt_dev; 这个结构体表达的意思是,字符型设备有这样的共性:它们都有一个以字符串形式表达的名字(name),都支持open、clo

34、se、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_flags; alt_fd;Dev:是指向设备类型结构体的指针;Priv:供驱动程序内部使用;Fd_flags:传递文件处理标志。6.8 开发HAL下的设备驱动 把字符型虚拟设备具体化程序清单6.4 描述uART设备的结构体typedef struct alt_dev dev; void* base; alt

35、_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 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

36、_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 *) dev;6.8 开发HAL下的设备驱动 把字符型虚拟设备具体化上面定义出了UART设备的数据类型,但是内存空间中还没有真正描述UART设备的数据域,接下来把UART设备实例化。程序清单6.4 描述uART设备的结构体见下页6.8 开发HAL下的设备驱动程序清单6.4 描述uART设备的

37、结构体#define ALTERA_AVALON_UART_INSTANCE(name, dev) static alt_avalon_uart_dev dev = ALT_LLIST_ENTRY, name#_NAME, NULL, /* open */ NULL, /* close */ 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_AV

38、ALON_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_BAUD ? ALT_AVALON_UART_FB : 0) | (name#_USE_CTS_RTS ? ALT_AVALON_UART_FC : 0) 6.8 开发HAL下的设备驱动 实现设备的具体操作上一步中,已经获得了设备的属性,也把访问函数地址填入相应的函数

39、指针,接下来的工作就是实现这些函数。实现这些函数例子见UART的实现文件6.8 开发HAL下的设备驱动 向HAL注册(Register)字符设备方法:在设备的初始化函数中调用字符设备驱动注册函数:注册函数返回负数表示注册失败,非负数(0和正数)表示操作成功。所以,只须检测返回值是否小于零,即可知道是否操作成功。例如:int alt_dev_reg(alt_dev* dev)#define ENODEV 50int func() err = -ENODEV; return err;6.8 开发HAL下的设备驱动n为各类设备创立驱动程序n文件子系统nHAL已经提供了一个文件系统,当把一个新的设备挂

40、载到HAL文件系统的某个点上时,可以用文件的方式来管理和操作它。n把文件子系统型虚拟设备具体化;n实现设备的具体操作;n向HAL注册文件子系统。6.8 开发HAL下的设备驱动n为各类设备创立驱动程序nFlash设备n 把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 r

41、ead; alt_flash_get_flash_info get_info; alt_flash_erase_block erase_block; alt_flash_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设备的数据结

42、构定义struct alt_flash_cfi_dev alt_flash_dev dev; int algorithm; int mode_width; 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

43、_query; alt_write_native_fn write_native;6.8 开发HAL下的设备驱动n为各类设备创立驱动程序nFlash设备n 实现Flash设备的具体操作n现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. a

44、lt_flash_write_block();6.8 开发HAL下的设备驱动n为各类设备创立驱动程序nFlash设备n 向HAL注册Flash设备n注册方法同字符设备,唯一不同是需要调用Flash设备注册函数:n注册函数返回0表示注册成功,返回一个负数表示注册失败。int alt_flash_device_register(alt_flash_fd* dev)6.8 开发HAL下的设备驱动n为各类设备创立驱动程序n以太网设备nAltera提供了SMSC lan91c111器件的驱动,因此用户如果想使用不同厂家的以太网芯片,编写驱动的一种简便的方法就是在lan91c111驱动的根底上进行修改。l

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

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

47、头文件后,编译器会在文件中插入下面一些代码:包含该设备的头文件;插入为该设备分配存储空间的宏定义:_INSTANCE;在初始化函数alt_sys_init()中插入初始化设备的宏定义:_INIT。6.8 开发HAL下的设备驱动程序清单的片段#include system.h#include sys/alt_sys_init.h“/* device headers*/#include altera_avalon_timer.h#include altera_avalon_uart.h“/* Allocate the device storage*/ALTERA_AVALON_UART_INSTA

48、NCE( 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下的设备驱动n把设备驱动集成到HAL中3. 设备头文件编写设备头文件的格式:设备头文件名要与SOPC Builder中对应的组件名一致。在设备头文件中以_INSTANCE的形式定义一个设备实例化的宏。在设备头文件中以_INIT的形式定义一个设备初始化的宏。6.8 开发HAL下的设备驱动程序清单6.12 alter_avalon_uart设备的实例化宏Nios II kit安装路径文件中定义#define ALTERA_AVALON_UART_INSTANCE(name, device) static alt_avalon_uart_dev device = ALT_LLIST_ENTRY, name#_NAME, NULL, /* open */

温馨提示

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

评论

0/150

提交评论