ckf513728912
发表于 2015-08-27 14:31
回复 7# kartorz
谢谢您的分享
shenlanyouyu
发表于 2015-08-28 09:03
本帖最后由 shenlanyouyu 于 2015-08-30 10:42 编辑
“以旧换新”这个服务还没有呢,家电行业倒有{:qq28:}
axlrose
发表于 2015-08-31 15:46
本帖最后由 axlrose 于 2015-09-04 14:32 编辑
这本书终于出来了,太棒了,家里书架上还放着第一版,看到之前宋老师的BLOG上本书介绍,多了好多新内核内容,设备树等都是3.x后才加入的
现在正在用3.14内核,很多时间都花在修改dts设备树上面,这本书里面好多新内容都适用,准备搞本来学习
1. 分享Linux内核学习和驱动开发的经验。
首先是看<linux设备驱动开发> 这书对驱动有个了解,实际开发中需要看当前内核里的子系统的实现,比如i2c, spi的,参考内核现有的示例
可以了解子系统是怎么与实际硬件打交道的,目前都是有很多现成的框架,找一个相近的修改
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
主要还是对硬件芯片的熟悉,对具体芯片功能要掌握,比如跟一些纯软件开发人员聊i2c,spi, 他们根本不知道是啥玩意,所以需要先掌握硬件基本知识
然后就是研究具体芯片数据手册,比如RTC pcf8563,需要找datasheet看懂里面的寄存器,然后才有办法去写驱动调试代码,驱动开发需要很多硬件知识
很多时候遇到bug,除了google, 找找patchwork网站上的补丁,官方内核补丁,然后就是自己去读代码分析
3. Linux内核有上百个驱动子系统,你研究过内核各种驱动子系统的共性,层次结构设计吗?分享学习一个Linux内核子系统的经验,例如USB、I2C、HID等driver。
仔细看过i2c和spi的驱动,
4. 您深入研究过Linux设备驱动模型,关注过Linux内核驱动的设计思想吗?
学习过linux的设备驱动模型,里面的设计用到了类似面向对象的思想,引用计数器等,非常巧妙,实现自动内存回收的功能。
其实可以看一下 barebox一个uboot-V2的东东,里面的驱动架构就是一个微型没有OS版的linux设备驱动模型,从学习角度上是很值得看看的
把设备结点通过/sys的目录树来表示,每个节点都可以很方便的通过文件来访问,每次的新节点添加删除都发生uevent事件,给应用层的udev很多处理的机会
5. Android系统是基于Linux内核的,传统的Linux驱动开发和Android驱动开发有什么区别?
区别不大,Android驱动开发是在原有linux kernel中做加法,加入了一些Binder, ashmem,Low Memory Killer, wake lock等
内核驱动开发上大同小异,在JNI层需要给android提供一个 libhardware适配层,也就是跟内核通信的一个统一抽象层 HAL,通过jni给上层的java提供接口,可以让Android App可以操作底层驱动,比较典型的是一个led灯的示例,这个网上能随便搜得到的
PS:
除了构建内核系统外,我现在用buildroot多些,拿来构建rootfs非常方便,之前跟一些嵌入式朋友交流,有的人还不知道这个玩意,使用后发现很棒,全自动化构建,添加软件包自动编译,不需要自己手工./configure , make , install这些麻烦事,构建交叉工具链也非常的方便
另外就是yocto, 现在用freescale芯片的朋友做嵌入式linux应该知道这全自动构建系统,类似gentoo portage
openwrt也是个好东西,以前以为只适用于路由器,其实改造一下,对于不需要使用yocto这种构建GUI型的系统功能的小系统很适用,ubus, uci, netifd, procd, init-hooks等都是很棒的小巧组件
shenlanyouyu
发表于 2015-09-01 22:36
回复 23# axlrose
感谢分享!
CN薰様
发表于 2015-09-02 13:05
总感觉这个分类有点奇怪。内核可以说是硬件无关的,除非非说是arm、ppc、mips、x86这样的。而驱动是硬件相关的。mtd、net子系统可以
归结到内核。
因为我本身就是做系统移植,所以总觉得驱动开发应该归结到嵌入式里面,因为当你完成用户的需求的话,就需要在SOC外围扩展各个芯片
那么这就需要对应的驱动;还有一种就不不是特定的通用芯片,比如数据采集类,大部分需要写FPGA、CPLD的逻辑,localbus或者pci(e)接口,
也需要驱动。
这2种情况是不一样的,第一种情况,目前的linux内核基本已经涵盖90%以上的设备驱动,无需自己开发,只是需要按照自己的设计修改地址、中断
参数;第二种情况就需要自己编写对应的设备驱动,很多情况做字符设备就可以解决。
内核我不太关心,驱动的话还是要多多看看芯片手册,诸如一些接口芯片的话只要能对接口协议比如uart、spi、usb的物理传输层协议很熟,基本上
在看内核实现问题也不大。
至于说和外围芯片打交道的驱动,如果带DMA的话,基本上就是准备请求->通过dma传输给外围芯片->外围芯片有数据通过dma传输回cpu->发起中断
->cpu响应中断处理返回数据
大部分是这个模式
其实linux编程相对简单,毕竟框架已经写好了,我们只需要封装底层的初始化、读写函数就可以了
快乐的土豆
发表于 2015-09-06 17:03
有干货,马克一下表示支持。
cnlnzz01
发表于 2015-09-11 18:13
cnlnzz01
发表于 2015-09-11 18:20