实验八 I/O口驱动实验 【实验目的】 1、了解 PXA270 微处理器 GPIO 的功能 2、熟悉 PXA270 微处理器 GPIO 驱动程序的编写方法 3、掌握驱动程序的加载过程和方法 【实验原理】 Linux以模块的形式加载设备类型,通常来说一个模块对应一个设备驱动,因此是可以分类的
将模块分成不同的类型或者类并不是一成不变的,开发人员可以根据实际工作需要在一个模块中实现不同的驱动程序
一般情况,一个设备驱动对应一类设备的模块方式,这样便于多个设备的协调工作也利于应用程序的开发和扩展
设备驱动在准备好以后可以编译到内核中(参考实验四的内容),在系统启动时和内核一起启动,这种方法在嵌入式 Linux系统中经常被采用
通常情况下设备驱动的动态加载更为普遍(参考实验七的内容),开发人员不必在调试过程中频繁启动机器就能完成设备驱动的开发工作
设备驱动在加载时首先调用入口函数 init_module(),该函数完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等一系列工作,其中最重要的一个工作就是向内核注册该设备,对于字符设备调用 register_chrdev()完成注册,对于块设备需要调用 register_blkdev()完成注册
注册成功后,该设备获得了系统分配的主设备号、自定义的次设备号,并建立起于文件系统的关联
设备在卸载时需要回收相应的资源,令设备的响应寄存器复位并从系统中注销该设备,字符设备调用 unregister_chrdev()、块设备调用 unregister_blkdev()
系统调用部分则是对设备的操作过程,比如 open、read、write、ioctl 等
图 8-1 为一个设备驱动模块动态挂载、卸载和系统调用的全过程
insmodrmmod内核空间用户空间register_XXX设备驱动内核模块unregister_XXX模块Init_