学峰的学习笔记 2011-06-02
一、linux-2.6.28.7内核配置过程
1,新编译好的内核下载到FLASH中,启动linux以后报错,说找不到rootfs入口,解决方法是内核编译选项中选中“file system->yaffs2 fs support”,以及"let yaffs to its ecc".
2,烧写好内核及文件系统后,发现无论怎么点击触摸屏,系统都没有反应,可是开发板自带的kernel烧上去后就没有问题,所以,判断问题还是出于内核配置的问题。解决办法是内核配置“device drivers->input device->(*)touchscreen interface并且(*)touchscreen event”, 以及“device drivers->input device->touchscreen->enable s3c2410 touchscreen”。配置完成以后,启动linux以后触屏功能正常,正常进入到屏幕校准的程序。但是屏幕校准很多次都有问题,判断有可能是x和y的坐标颠倒了,下面进行修改。(其实起初我也不能肯定是哪里有问题,只是命令行能打印出touchscreen点击的坐标信息,但是系统界面就是没有反应,所以我才想驱动应该没问题,问题可能出在和qtopia沟通的问题,然而文件系统又没有问题,因此,我只能抱着试试的态度把内核当中的touchscreen interface选上,再把event功能选上,没想到还真的行了,其实就是猜出来的。现在真是汗颜呀。。。以后开发要是靠猜的话,那活就没法干了。。。)
3,现在出现屏幕校准总是无法通过的问题,看开发板的说明文档上说,应该是x和y坐标颠倒了。因此想办法修改代码。我确定是/drivers/input/touchscreen/s3c2410_ts.c这个文件操作touchscreen,但是不应该修改驱动代码(因为代码没有错),只能修改与板相关的定义文档,因此修改了/arch/arm/plat-s3c/include/plat/regs-adc.h,这些都是与板相关的寄存器值的定义,我修改了:
#define S3C2410_ADCDAT0 S3C2410_ADCREG(0x0C)
#define S3C2410_ADCDAT1 S3C2410_ADCREG(0x10)
修改为
#define S3C2410_ADCDAT1 S3C2410_ADCREG(0x0C)
#define S3C2410_ADCDAT0 S3C2410_ADCREG(0x10)
然后重新编译内核,烧入后就解决了这个问题,触摸屏成功校准,然后一切正常。
考虑这次修改,把x和y的数据寄存器交换了,我觉得这样改有可能在以后会出现问题,比如可能影响到AD转换时的某些功能。但是目前真想不出什么更好的办法,先这样吧。
4.为开发板配置LED流水灯驱动和功能
需要首先配置内核,“device drivers->leds driver->(M)led class”以及“device drivers->leds driver->(M)s3c24xx led drivers”总共选择了两项,并且都选择编译为模块的形式。保存,
在重新编译内核之前,需要修改一下内核当中的板级文件,这里主要需要修改/arch/arm/plat-s3c24xx/common-smdk.c文件,里面定义了led设备的led-platform-device和led-platdata,在这个文件中,需要根据开发板硬件电路图分析出led接在哪个GPIO口上了,然后进行相应修改,文件中原来是GPF4,改为GPB5,改了四个灯。然后修改文件中的设备结构数组,修改设备初始化函数。这些地方都需要修改,修改内容根据修改后的led-platform-device和led-platdata。
修改完后,重新编译内核,结果在/drivers/leds/目录下生成了两个文件:leds-class.ko以及s3c24xx-leds.ko. 其中,s3c24xx-leds.ko模块依赖于leds-class.ko文件,insmod的时候,需要先insmod leds-class.ko文件。
在开发板上成功insmod s3c24xx-leds.ko后,可以发现在/sys/devices/platform/下面多了led灯的设备,让灯点亮和熄灭的方法是:
cd /sys/devices/platform/s3c24xx-led.0/s3c24xx-led.0
echo 1 > brightness(开灯)
echo 0 > brightness(关灯)