最近要研究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+]可以列出所有的选项,选择序号加空格跳进相应的位置。
可以看到有两处位置可以跳转
LCD驱动的改动
先是一些参数的修改,
pixclock后面的HCLK时钟60MHZ是错误的,HCLK总线时钟应该是100MHZ,pixclock=HCLK/DCLK
改屏为3.5寸的屏,修改内容为上
修改的值查看LCD3.5寸屏datasheet
此值我们跳入相应的定义处
显示是lpc3600 控制寄存器有关的值,查了datasheet发现
.plcsel的值有十二个位,最后一个位为控制位,由于我们没有用到LPC3600,所以我们将最后一个位改为0就ok
然后我们去配置make menuconfig
然后我们lcd就能完整显示了。