rv1126 驱动知识点总结
1主设备号和次设备号为了方便管理Linux 中每个设备都有一个设备号设备号由主设备号和次设备号两部分组成主设备号表示某一个具体的驱动次设备号表示使用这个驱动的各个设备。2dts和dtsi一个 SOC 可以作出很多不同的板子这些不同的板子肯定是有共同的信息将这些共同的信息提取出来作为一个通用的文件其他的.dts 文件直接引用这个通用文件即可这个通用文件就是.dtsi 文件类似于 C 语言中的头文件。一般.dts 描述板级信息(也就是开发板上有哪些 IIC 设备、SPI 设备等).dtsi 描述 SOC 级信息(也就是 SOC 有几个 CPU、主频是多少、各个外设控制器信息等)。3:设备树的编译和反编译sudo dtc -I dtb -O dts kernel_tegra194-p2888-0001-p2822-0000.dtb kernel_tegra194-p2888-0001-p2822-0000.dtssudo dtc -I dts -O dtb kernel_tegra194-p2888-0001-p2822-0000.dts kernel_tegra194-p2888-0001-p2822-0000.dtb4bootargs解析传递给Linux内核的bootargs是uboot下bootargs环境变量的值加设备树里面bootargs属性的值。这个通过查看linux内核的cmdline(命令行)参数来得到5 自旋锁API函数适用于SMP或支持抢占的单CPU下线程之间的并发访问也就是用于线程与线程之间被自旋锁保护的临界区一定不能调用任何能够引起睡眠和阻塞的API函数否则的话会可能会导致死锁现象的发生。自旋锁会自动禁止抢占也就说当线程A得到锁以后会暂时禁止内核抢占。如果线程A在持有锁期间进入了休眠状态那么线程A会自动放弃CPU使用权。线程B开始运行线程B也想要获取锁但是此时锁被A线程持有而且内核抢占还被禁止了线程B无法被调度出去那么线程A就无法运行锁也就无法释放好了死锁发生了6 锁和中断线程之间的并发访问如果此时中断也要插一脚中断也想访问共享资源那该怎么办呢首先可以肯定的是中断里面可以使用自旋锁但是在中断里面使用自旋锁的时候在获取锁之前一定要先禁止本地中断(也就是本CPU中断对于多核SOC来说会有多个CPU核)否则可能导致锁死现象的发生线程A先运行并且获取到了lock这个锁当线程A运行functionA函数的时候中断发生了中断抢走了CPU使用权。右边的中断服务函数也要获取lock这个锁但是这个锁被线程A 占有着中断就会一直自旋等待锁有效。但是在中断服务函数执行完之前线程A是不可能执行的线程A说“你先放手”中断说“你先放手”场面就这么僵持着死锁发生最好的解决方法就是获取锁之前关闭本地中断