知识零碎:
头文件查找: /arm/路径下的头文件
linux驱动程序的编写,编译,运行过程
-------------------------------------------------------------------------------------------------------------------------------- 1.编写 key_misc_driver1.c文件 2. 修改Makefile文件中的obj-m,填入.c文件,改为.o文件
3. make clean 清除上次生成的.o一系列文件 make 生成新的.o系列文件 4. cp key_misc_driver1.ko ~/nfs/rootfs 5. arm-linux-gcc -oapp main.c 交叉编译器编译 6. 内核代码 insmod key_misc_driver1.ko 插入模块 7. ./app 运行 8. rmmod key_misc_driver1 删除模块
简述字符设备驱动框架? ←(背)
总结:
=====设备驱动初始化函数=====
(1)申请字符设备号(alloc_chrdev_region)->dev_t
(2)字符设备初始化(cdev_init)->fops<->led_dev
(3)添加设备号(cdev_add)->字符设备文件操作结构体led_dev<->dev_t
(4)创建设备结点-创建类(class_create)-类下创建设备(device_create)
(5)寄存器映射(ioremap)
(6)裸机设备初始化(led_init)
=====字符设备文件操作结构体函数=====
(1)【copy_from_user】:用户空间写入寄存器
(2)逻辑设备驱动(led_on)
=====字符设备驱动卸载函数=====
是字符设备驱动初始化函数的逆过程
←(背诵详细版)
=========================================================================
(Linux环境下的字符设备驱动都是围绕着cdev这个结构展开的,它本身是linux系统对字符设备的抽象,所以重点就是cdev的初始化。 1.我们首先初始化file_operrations结构体的初始化 方便用户层在进行系统调用时进行内核调用完成对设备的控制
2.然后申请设备号,用alloc——chadev——region,有了设备号就可以用cdevinit进行初始化
3.初始化之后通过cdev——add将设备添加到内核中,这样我们就完成了cdev的初始化。)
←(简略理解版)
自动获得设备号函数
alloc chardev region:分配字符设备区域 *dev:设备号的数据类型(unsigned int) baseminor:申请的子设备号从几开始 count:申请子设备号的个数 *name: 设备起名
---------------------------------------------------------------------------------------------------------------------------------
cdev:类型名
12(高位) 20(低位)
特殊: 所有的主设备号都是10号
混杂设备是字符设备的一种。