后续会提到文件系统和虚拟文件系统所以先在开头说明一下。
文件系统就是操作系统是明确存储设备组织文件的方法(管理文件内容的编辑及目录的编排的程序)
种类有:FAT、NTFS、EXT/1/2/3/4(linux用的)、tmpfs(基于内存,内存文件系统) (查看文件属于的文件系统用命令:df -T)
可在/etc/init/bootmisc.sh.conf 或修改/etc/rc.local,加入可执行文件执行命令,即可设置开机启动。
linux根目录下文件夹的分区不同,文件系统不同,文件的操作方式也不同,所以虚拟文件系统解决了这个操作方式不同的问题。
虚拟文件系统是对各种文件系统的一个抽象,给开发者通过一个接口。
open等API调用驱动文件时识别的方式有两个:
1.文件名
2.设备号
主设备号:区分不同种类的设备
次设备号:区分同一类型的多个设备
所以添加驱动的过程为:设备名>>设备号>>设备驱动函数(操作寄存器驱动io口)
static struct file_operations pin4_fops ={
.owner = THIS_MODULE, //前缀.为单独提取该结构体类型中的其中一个元素进行操作
.open = pin4_open,
.write = pin4_write, //函数指针,为我们定义的驱动函数
};
我们需要先定义一个自定义的设备驱动函数,在file_operation类型的结构体中注册
int __init pin4_drv_init(void)
{
int ret;
devno = MKDEV(major,minor); //major为主设备号,minor为次设备号
ret = register_chrdev(major,module_name,&pint4_fops); //注册驱动函数,module_name为模块名
pin4_class = class_create(THIS_MODULE,"myfirstdemo"); //自动生成设备到/dev/底下,第二个参数为设备名
pin4_class_dev = device_create(pin4_class,NULL,devno,NULL,module_name); //创造设备文件
}
module_init(pin4_drv_init); //驱动入口注册
通过设备名,设备号,驱动地址,注册驱动
该函数是在insmod安装驱动的时候调用的
void __exit pin4_dev_exit(void)
{
device_destroy(pin4_calss,devno); //销毁设备
class_destroy(pin4_class);//销毁类
unregister_chrdev(major,module_name);//卸载驱动
}
module_exit(pin4_dev_exit); //卸载驱动
取驱动源码:以模块的方式编译
将驱动源码放入linux内核源码目录下的/driver/char/
修改在Linux内核源码目录下的Makefile
加入:
obj -m += "驱动程序文件名" //-m意思是以模块的方式编译
编译:
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules
该命令会生成pin4driver2.ko
然后使用以下命令将生成的模块文件用scp传入树莓派中生成驱动
sudo insmod pin4driver2.ko //会在/dev/下生成pin4模块文件
sudo chmod 666 /dev/pin4 //给予所有使用者权限