Linux驱动中简单字符框架中一些特殊点

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取反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值