0702阶段总结

声明:文章部分内容来源于网络,如有侵权,请及时通知,本人将删除相应部分,文章仅为个人学习记录

1.Linux内核对寄存器的操作,需要对相应的地址进行映射才能访问相应寄存器地址的值。
裸机上对寄存器的操作:

*((volatile unsigned short*)SYS_DMAOR_L) = 0x0000;

SYS_DMAOR_L 为寄存器地址的宏;

在Linux驱动层则需要进行转换。

sys_dmaor_addr= (u32)ioremap(SYS_DMAOR_L,4);
__raw_writel(0x0000, (volatile void __iomem *)sys_dmaor_addr);
__raw_readl((volatile void __iomem *)sys_dmaor_addr);

注意:
对寄存器的操作一般要先对地址进行申请在进行映射操作,这个可以取得该地址的控制权,因为我们无法知道有谁也在对该寄存器进行操作。

request_mem_region(addr,4,"navidrv")

另外:ioremap的申请有数量限制,使用完需要对其进行释放,否则申请都一定的数量可能会出现段错误。

2.device tree 心得
设备树保存着对设备操作的一些信息。在Linux系统下通过匹配compatible = “regulator-fixed”字段获取设备的一些相关信息。
device tree一般在probe函数中被解析,probe函数的调用过程:
关于probe的调用过程是从网络上转载
http://blog.chinaunix.net/uid-25508271-id-2979412.html
kernel_init中do_basic_setup()->driver_init()->platform_bus_init()->…初始化platform bus(虚拟总线)
设备向内核注册的时候platform_device_register()->platform_device_add()->…内核把设备挂在虚拟的platform bus下
驱动注册的时候platform_driver_register()->driver_register()->bus_add_driver()->driver_attach()->bus_for_each_dev()
对每个挂在虚拟的platform bus的设备作__driver_attach()->driver_probe_device()->drv->bus->match()==platform_match()->比较strncmp(pdev->name, drv->name, BUS_ID_SIZE),
如果相符就调用platform_drv_probe()->driver->probe(),如果probe成功则绑定该设备到该驱动.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值