1: 注册字符设备的函数
看视屏当中用到的字符注册函数为:register_chrdev(主设备号,设备名字,fops结构体)
注册时的方法分为两种、
1:先 cat /proc/devices看一下空闲的设备号(从后往前选取一个空闲的设备号进行注册)。当使用这种方法注册时register_chrdev函数的返回值小于0以为着注册失败。
2:传进去的主设备号为0则意味着自动分配主设备号。返回值就是自动注册的设备号。
其实追进内核代码去看register_chrdev函数的具体实现就是之前所学习的利用struct cdev结构体和cdev_init、cdev_add、MKDEV宏等函数进行实现的。
register_chrdev是比较早期驱动注册方法,它的好处在于简单,但是其无法精准注册子设备号,所以有了后来的MKDEV宏注册设备的方法。
2:ioremap函数
ioremap函数的功能是实现物理地址到虚拟地址的映射,其参数有两个分别是ioremp(物理地址,地址后用到的内存单位),其返回值是一个指针一般用unsigned int *p来接,p就会指向映射到的那一块虚拟内存。需要注意的一点是使用完ioremap后必须使用iounmap来取消映射。
3:request_mem_region函数
request_mem_region(起始地址,地址的名字,地址的带下)函数,向内核申请(报告)需要映射的内存资源。(非刚需,类似于内存总管)其实说白了,request_mem_region函数并没有做实际性的映射工作,只是告诉内核要使用一块内存地址,声明占有,也方便内核管理这些资源。
若使用时用在ioremap的前面,release_mem_regio用在iounmap的后面。
5:给寄存器赋值时的"迷之操作"
起因是在给寄存器赋值时想去把某一位清零直接进行了以下操作。
比如是要给第5位清零:
GPMDAT &= (0x0)<< 5 (错误)
这样子做导致其他的位也被清0 了
GPMDAT &= ~(0x1) << 5 (正确)
这样子的会把其余的0位给取反为1,那么与上去后则不会影响其余位
总结:置1直接或1,置0与1取反