嵌入式Linux之字符设备的驱动

2019-07-12 14:16发布

驱动程序是字符设备。写一个驱动程序:1、写框架;2、完善硬件的操作:a、看原理图;                                b、看芯片手册;
                                c、写代码。LED驱动程序      裸板开发时使用的是物理地址,在嵌入式linux系统驱动开发时所使用的是虚拟地址,通过 ioremap()函数 进行虚拟地址的映射。使用iounmap()函数退出虚拟地址的映射。
除此之外,Linux内核源码中也提供了类似于stm32库函数的相关封装好的函数,可直接使用。在初始化的注册程序中,注册设备时设备号取0,使用系统自动分配的设备号。编译驱动程序的Makefile比较简单,链接内核的所在目录,以及生成的文件名即可:驱动程序的入口函数和出口函数,以及相关权限获取:
写了一个很简单的LED驱动程序,无法编译成功

此时需要重新编译内核。
将驱动文件拷贝至挂载的文件夹,使用单板运行驱动程序,注册驱动的命令是insmod +“驱动文件名”,卸载驱动的命令是rmmod +“驱动文件名”。使用cat /proc/devices 查看当前单板所支持的设备。
使用交叉编译链,编译测试程序生成可执行文件
若在执行该可执行程序时打开失败,则可能是在不存在该驱动的注册文件,所以使用 mknod命令用于创建Linux中的字符设备文件和块设备文件。Tips:      Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录 下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每 个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编 号,如硬盘的主设备号是3。Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设 的种类较多,操作方式各不相同。Struct file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。打开一个文件就是调用这个文件file_operations中的open操作。不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件, 接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设 备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。除此之外不能打开设备还有可能是存在的设备文件与设备号不匹配。卸载驱动: