2014年(42)
分类: LINUX
2014-11-19 19:07:56
原文地址:linux2.6.37.4在XC2440上移植成功 作者:小超hide
在现在的公司做了半年的驱动,对驱动也有了一个新的认识,我一直看高通的android代码,觉得高通的驱动做的挺专业的,就算一个LED的驱动也要写个几百行。我准备尝试用新版的内核,将内核中所有能用的驱动都用在XC2440上。
这次使用2.6.37.4的内核,2011年3月14日发布,内核中已经集成了三星S3C平台几乎全部的驱动,我们无需再手动编写驱动了,我的主要工作就是完成了mach-xc2440.c
Nand |
支持512B/2K页面nandflash |
LCD |
支持16bit/24bit数据格式,支持3.5/4.3/7寸等多种尺寸的TFT LCD |
Uart |
支持3个uart驱动 |
Ethernet |
DM9000X驱动/smsc911x驱动 |
Audio |
IIS总线uda134x驱动 |
Sd/mmc |
支持SD/TF卡 支持最大容量32G |
Usb host |
USB1.1协议,支持U盘,USB鼠标键盘等设备,可外接USB HUB |
USB Device |
支持usb gadget,可将开发板当做U盘使用,可以和PC机连接传输数据 |
Rtc |
s3c平台通用的RTC驱动 |
Watchdog |
s3c平台通用的看门狗驱动 |
Led |
通用的led-gpio驱动 |
Key |
通用的key-gpio驱动,input设备 |
Beep |
pwm控制蜂鸣器驱动,input设备 |
Hwmon |
s3c平台通用adc驱动,最多支持8个通道 |
Touchpanel |
s3c平台通用触摸屏驱动,input设备 |
Lcd backlight |
pwm控制LCD背光亮度驱动 |
Camera |
使用三星camif接口和v4l架构,可驱动多种型号的camera,使用v4l API可方便编写上层应用程序 |
AT24CXX |
基于IIC总线的EEPROM驱动 |
MCP251X |
基于SPI总线的CAN总线器件驱动 |
IRM |
红外摇控器驱动,NEC编码格式,input设备,可做键盘用 |
在1月份的时候开始移植2.6.36内核,开始比较顺利,后来麻烦就开始多了。
首先是YAFFS2文件系统,内核里代码结构有改动,以前的yaffs2源码需要改,改完后就挂不上,然后就到处找新版的yaffs2源码,一个一个的试,最终有一个可以用了。
然后是触摸屏,使用以前的tslib打开触摸屏设备的时候失败,这个问题不大,跟踪一下tslib代码,发现内核input驱动的ID号和tslib中定义的不匹配,导致了open tsdev的时候返回了,改一下ID号使之一致就可了。(有个卖开发板说是tslib经过他们深度修改,不提供源码,真能忽悠人,其实就是改了一个数字,没必要搞的那么神秘)接下来的问题是有时不响应中断,查看驱动的源码中也有这样的注释
/* TODO we should never get an interrupt with down set while
* the timer is running, but maybe we ought to verify that the
* timer isn't running anyways. */
可能写驱动的人也注意到这个问题了,我查看了更高版本的内核代码,都是一样的,没有解决这个问题。也不知过了多久,突然有一天无意的改代码时就改好了,以后再总结一下原因。
然后再搞PWM驱动,这也是难题,以前从来没做过,使用内核自带的PWM驱动,控制LCD背光和蜂鸣器。费了好大劲把驱动移植上去了,有设备节点了,但是操作时没反映,跟踪一下PWM驱动,发现内核自带的有问题,tcon有一位配置错了,改过来就好了。
到3月14号的时候去kernel官网上看到2.6.37.4发布了,就准备移植这个,基本的驱动和2.6.36都是一样的,只有声卡有问题。从2.6.37开始,sound源码结构就改变了,card和codec这些都分开了,需要单独创建一个"uda134x-codec"和"s3c24xx-pcm-audio"平台设备,似乎2.6.37的sound代码不完善,怎么加也不行,就用了2.6.38的代码,声卡设备可以正常加载,但是没有声音出来,又用了2.6.39的,还是不行,郁闷的要死。因为以前在2.6.36中的声卡是正常的,就把sound代码全替换成2.6.36的,问题解决!
最难的就是camera驱动了,我准备使用V4L2架构编写camera驱动,这样写上层应用就方便多了,在QT中也有现成的camera程序。以前做过高通平台的camera驱动,真是噩梦,出了问题要追踪几十个文件。
现在v4l2的核心部分已经加上了,s3c_camif,ov7670,IIC都加上了,但是不知道哪里还有问题,最近再研究。