最近要研究LCD屏的驱动,对驱动模块的框架有一定了解后就可以比较送的看linux驱动源码了,恰好s3c2440里面自带的有驱动源码,所以先从现有的样例入门,而且板子lcd显示的每次就只有半个屏幕,一定是驱动源码有问题,或者是make menuconfig配置有问题
为了查看源码,下载了我们的看源码利器ctags,在成千上万的c文件里穿梭自如,ctags -R * 为arm目录下文件创建索引文件tags这样我们就能实现函数的跳转,妈妈再也不用担心我找不到函数定义了=-=,但是有个问题你索引的目录树约大,tags文件的大小越大。
建立索引的步骤: 首先可以~/.bash_profile中添加命令的别名,因为我们的命令实在是太长了: alias tag=‘cscope -Rbq && ctags --C-Kinds=+defglmnstuvx --langmap=c:.c.h.ho.hem.het.hec.hev.him.hit.hic.hiv -R .’ 保存 然后运行source ~/.bash_profile让他生效:
在要建立的目录树下建立tags索引 我是在linux-3.0目录下运行tag,就产生了tags和cscope文件
然后还要做vim的配置 进入当前目录下的.vimrc,在最后一行写入:set tag=/home/xiaobaicai/fl2440/linux/linux3.0
先来说说ctags的使用
static struct platform_device *smdk2440_devices[] __initdata = { &s3c_device_ohci, //开放式控制接口设备 &s3c_device_lcd, //LCD屏设备 &s3c_device_wdt, //看门狗设备 &s3c_device_i2c0, //i2c总线设备 &s3c_device_iis, //网络通信设备 &s3c_device_dm9000,/*添加dm9000网卡设备*/ };可以看到我们platform_device中添加了lcd的设备,下面我们来看看他的设备信息
struct platform_device s3c_device_lcd = { .name = "s3c2410-lcd", .id = -1, .num_resources = ARRAY_SIZE(s3c_lcd_resource), .resource = s3c_lcd_resource, .dev = { .dma_mask = &s3c_device_lcd_dmamask, .coherent_dma_mask = 0xffffffffUL } };对着我们的&s3c_device_lcd就是一顿ctrl+]就跳到了我们的设备结构体里面来了,如果发现有很多同名的跳转,g+]可以列出所有的选项,选择序号加空格跳进相应的位置。 可以看到有两处位置可以跳转
先是一些参数的修改, pixclock后面的HCLK时钟60MHZ是错误的,HCLK总线时钟应该是100MHZ,pixclock=HCLK/DCLK 改屏为3.5寸的屏,修改内容为上 修改的值查看LCD3.5寸屏datasheet
此值我们跳入相应的定义处 显示是lpc3600 控制寄存器有关的值,查了datasheet发现 .plcsel的值有十二个位,最后一个位为控制位,由于我们没有用到LPC3600,所以我们将最后一个位改为0就ok
然后我们去配置make menuconfig 然后我们lcd就能完整显示了。