首页 » 技术文章 » 基于μCLinux的USB驱动程序实现

基于μCLinux的USB驱动程序实现

作者:  时间:2011-03-09 13:56  来源:EDN

  22 确定编写需要的file-operations数据结构中的功能函数

  该驱动文件ft245b1C中定义的file_operations数据结构:

  23 设备的注册与注销

  设备驱动在调用前必须首先向系统注册,这时就执行加载函数static int_init FT245BL_init(void)。该函数的核心语句是 register_chrdev(ft245bl_majorFT245BL_DEV&ft245bl_fops)字符注册函数。其中,ft245bl_major是设备驱动向系统申请的主设备号;FT245BL_DEVUSB设备的名称;ft245bl_fops是之前定义为 file_operations数据结构的各个功能函数的文件指针。该函数返回值为0,表示注册成功;返回-INVAL,表示申请的主设备号非法;返回 -EBUSY,表示该设备号正在使用。设备注册成功后,设备名会出现在系统的/procdevices文件中。

  设备有注册就有卸载,卸载字符设备需要调用函数unregister_chrdev(ft245bl_majorFT245BL_DEV),参数有主设备号和设备名两个,USB退出驱动,用staticvoid_exit ft245bl_exit(void)函数。

  24 编写相应的功能函数

  对于每一个设备驱动程序来说,都有一些与此设备密切相关的功能函数,通常对于块设备或者字符设备来说,都存在着诸如打开、关闭、读、写这一类的操作。当进行系统调用时,将自动地使用驱动函数中特定的函数来实现具体的操作。打开函数open()主要完成以下操作,即检查设备错误(诸如设备未就绪或相似的硬件问题),如果是首次打开,则初始化设备;读取次设备号;分配和填写要放在file→private-data内的数据结构;增加使用计数。读函数 read()用来从外部设备中读取数据,当其为NULL指针时,将引起read()系统调用返回-EINVAL(“非法参数”)。函数返回一个非负值表示成功地读取了多少字节。写函数write()向外部设备发送数据,如果没有这个函数,返回一个-EINVAL;如果返回值非负,就表示成功写入的字节数。当设备被关闭时调用release()这个操作,有时也称为close()。它应该完成以下操作:使用计数减1;释放open分配在 file→rivate-data中的内存;在最后一次关闭操作时关闭设备。下面是FT245BL驱动程序读函数read()的实现:

  读取函数ft245bl_read通过判断USB芯片RXF管脚的状态来处理接收到的数据,如果RXF0,表示接收缓冲区(RX FIFO)中至少有1个数据,处理器读取一个数据后重新回到判断;如果RXF1,表示芯片没有接收到数据,这时程序启动中断等待事件函数 wait_event_interruptible,内核从USB设备驱动中释放出来,运行其他程序,直到有新的数据到来时,内核首先执行中断处理函数 ft245bl_rx_handler,将中断标志位irqflag1,唤醒等待队列ft245bl_waitqueue,然后再回到读取函数中继续运行。

  25 中断处理

  设备驱动程序通过调用中断申请函数申请中断,其格式为:

  函数调用成功返回0值,返回-INVAL表示中断号超出范围或者handler=NULL;返回-BUSY表示中断已经被占用且不能共享。其中,handler是中断处理子程序指针,中断产生时自动调用该函数;参数irq为中断号;pt_regs为中断发生之前寄存器的映像,很少使用;irqflags控制中断行为。irqflags=SA_INTER-RUPT表示它在运行时将禁止所有的中断;irqflags=SA_SHIRQ 表示共享此中断处理程序;devname为设备名称;dev_id用于支持中断的共享,它将作为第2个参数传递给中断处理函数,可以利用它来传递一些必要的信息。该中断处理程序如下:

  3 实现驱动程序的加载

  驱动程序可以按照两种方式编译:一种是静态编译进内核;另一种是编译成模块以供动态加载。该设备驱动程序采用静态编译进μCLinux内核。下面以在嵌入式μClinux系统中需新增一个USB字符型设备FT245BL为例,介绍设备驱动程序的添加的一系列步骤。

  31 配置相关信息

  首先,将编写好的驱动程序复制到μClinux系统的文件目录中。新建ft245bl目录统一管理USB设备的驱动文件包括C文件、头文件、编译文件、配置文件,存放于目录μClinux-distlinux-26xdriverschar/下,在ft245bl下新建Makefile,并在下面两个编译文件中添加编译指令:

  在ft245bl下新建配置文件Kconfig,添加驱动名FT245BL_DRIVER、菜单选项名称USB ft245bl Driv-er、菜单有效选项DRIVER_FT245BL及驱动说明,代码如下:

  第1项是μClinux系统为设备驱动创建的驱动文件名及所在目录;第2项是设备类型;第3项是设备驱动文件的权限;第45项分别为用户ID和组ID;第67项为主设备号和次设备号;第8910项分别为次设备号的起始号码、增量和数量。

  32 编译驱动程序

  在/homeμClinuxμClinux-dist目录下运行make menueonfig进行配置,在字符设备选项中可以看见刚刚添加的FT245BL Driver选项,选中它。通过make的一系列编译,所有内核和应用程序源代码将被编译,编译结束后将产生二进制文件uImage

  33 加载驱动程序

  这里的BF533主板中数据存储器SDRAM大小为32 MB,地址为0Ox02000000;异步存储区BootFLASH大小为4 MB,地址为0x200000000x203FFFFF。在/homeμClinuxμClinux-dist运行指令下,把uImage文件拷贝到/svrtftp目录,tftp是一个简单的ftp下载:

cp imagesuImagesvrtftp

  打开超级终端μClinux,接通目标板电源或按复位键,目标板上的u-boot自动启动,通过超级终端的串口输入命令:

  到此,在μClinux中添加设备驱动程序的工作已经完成。

  4

  介绍了基于Blackfin ADSP-BF533开发板,在μClinux环境下USB芯片FT245BL驱动程序的设计与加载。简述了设备驱动程序开发的过程,并给出了读函数和中断函数的实例,说明了在μiClinux下如何添加FT245BL驱动程序的方法,实现了DSP主板的USB端口通信。

相关推荐

Linux将进军汽车智能系统领域

Linux  汽车智能系统  2013-07-09

Android回归Linux核心怀抱

Google  Linux  Android  2012-11-01

EXT4数据损失bug影响Linux稳定版内核

EXT4  Linux  2012-10-25

Fedora Linux 18 延期至年底

Fedora Linux 18  2012-10-17

CEVA凭借90%的市场份额继续领导DSP IP市场

CEVA  DSP  2012-05-30

欧胜推出带有语音处理器DSP的下一代音频中枢

欧胜  DSP  2012-05-07
在线研讨会
焦点