没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、让 LCD 显示可爱的小企鹅
还是先说说环境吧,处理器为 S3C2410,linux 的版本当然是 2.6.20 的。下面先说说怎样让
LCD 上显示出可爱的小企鹅。最直接的步骤如下(记住不要问为什么哈~_~,一步一步
跟着走就行了):
1. 添加 s3c2410 处理器的 LCD 控制寄存器的初始值,具体做法为在文
件 arch/arm/mach-s3c2410/mach-smdk2410.c 中添加 struct s3c2410fb_mach_info 类型
的寄存器描述讯息,如下所示:
static struct s3c2410fb_mach_info smdk2410_lcd_platdata = {
.fixed_syncs=0,
.type = S3C2410_LCDCON1_TFT,
.width= 240,
.height= 320,
.xres = {
.defval= 240,
.min= 240,
.max= 240,
},
.yres = {
.defval= 320,
.min= 320,
.max= 320,
},
.bpp = {
.defval= 16,
.min= 16,
.max= 16,
},
.regs = {
.lcdcon1= S3C2410_LCDCON1_TFT16BPP | \
S3C2410_LCDCON1_TFT | \
S3C2410_LCDCON1_CLKVAL(5) | \
(0<<7),
.lcdcon2= S3C2410_LCDCON2_VBPD(2) | \
S3C2410_LCDCON2_LINEVAL(320-1) | \
S3C2410_LCDCON2_VFPD(2) | \
S3C2410_LCDCON2_VSPW(4),
.lcdcon3= S3C2410_LCDCON3_HBPD(8) | \
S3C2410_LCDCON3_HOZVAL(240-1) | \
S3C2410_LCDCON3_HFPD(8),
.lcdcon4= S3C2410_LCDCON4_HSPW(6) | \
S3C2410_LCDCON4_MVAL(13),
.lcdcon5= S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_HWSWP,
},
.gpcup= 0x0,
.gpcup_mask= 0xFFFFFFFF,
.gpccon= 0xaaaa56a9,
.gpccon_mask= 0xFFFFFFFF,
.gpdup= 0x0,
.gpdup_mask= 0xFFFFFFFF,
.gpdcon= 0xaaaaaaaa,
.gpdcon_mask= 0xFFFFFFFF,
.lpcsel= 0x00
};
2. 通过 s3c24xx_fb_set_platdata 函数向内核注册上面的信息。具体做法为:修改
s3c24xx_fb_set_platdata 函数(当然也可以重新起名字),修改如下:(此函数在 arch/
arm/mach-s3c2410/devs.c 中)
void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
{
s3c_device_lcd.dev.platform_data = pd;
}
然后在 arch/arm/mach-s3c2410/mach-smdk2410.c 的 smdk2410_map_io 函数中调用
s3c24xx_fb_set_platdata( ),具体为:
s3c24xx_fb_set_platdata(&smdk2410_lcd_platdata);
注:此处未采用内核中提供的源函数,因为系统会崩溃,估计是它调用 kmalloc 函数
引起的。
3. 在 make menuconfig 的时候配置 Linux 的 logo 选项,然后的时候在 console 选项中选上
framebuffer console surpport,要不然看不到小企鹅。
上面这些步骤均来源于网上,感谢您们的无私贡献!嘿嘿,到目前为止差不多也可以
交差了,但我还想深入了解一下真正的驱动程序。呵呵,欲知后事如何且听下回分解。
二、 函数分析
驱动的入口点
摆在面前的第一个问题相信应该是,这个函数是从那里开始运行的。这里就应该从
开始了,打开 文件,然后找到
函数,先不管它里面是怎么回事,再把目光下移就会看到这样一串字符
串 ,郁闷,这和 有啥关系嘛?
这个问题问的好!不要着急慢慢往下面走。先摸摸 是何方神圣再说,于是
乎我就登陆了 !"###$%网站,在上面一搜,原来
老家在 #!,原来它居然还有两重身份,其原型如下:
&'()*+,
--
&.##/0
--
&
--
&.12
1
3/41
&/
--
&
从上面可以看出, 到底用哪个,就取决于 '()*+, 了,那么
'()*+, 的作用是什么呢?我们知道 +# 可以将设备当作模块动态加进内核,也可以
直接编译进内核,说到这里大概有点明白 '()*+, 的作用了,不错!它就是要控制一个
驱动加入内核的方式。定义了 '()*+, 就表示将设备当作模块动态加入。所以上面的①
表示将设备加进内核。在②中的&很有意思,这代表什
么呢?主要 就是属性的意思,它的英文意思是别名,可以在 !"
#5#67
8#5!
找到它的详
细说明,这里简单的说 &/
的意思为 是 的别名,或者 是 的一个连接,
再简单一点说这个时候 宏基因突变成了 了。对于第一种
情况,又被宏定义成了 ,也就是说
#等于 。对于 又是一个宏
定义,它被定义成了.9%9::%,至于这个宏表示什么意思,在这里
就不啰嗦重复了,在 +#;% 的 5< 驱动分析一这篇文章中有对它的揭秘。
上面啰嗦了这么多,最终是要说明只要用 申明了一个函数,该
函数就会被 +# 内核在适当的时机运行,这些时机包括在 # 启动的
时调用(设备被编译进内核),或者在动态插入时调用。
回到上面的 处,也就是说内核与 = 驱
动发生关系的第一次地点是在 函数,该函数就只有一条语句
>;
??????……
是何许人也
可以理解成一种设备类型,就像字符设备、块设备和网络设备一样,
而 + ) 就属于这种设备。对于 设备 +# 为应用添加了相关的接口,在这里
只是简单的说说这些接口的用法,而不去深入探讨这些接口的实现(我现在还没有那个能
力呢!)。说到这里,马上就有个问题涌上心头了,那就是 +# 提供了那些接口呢?如
果我们需要添加这些设备应该怎么样做呢?
中的相关数据结构是应用的关键,为了向内核添加一个
设备,程序员应该填写两个数据结构 和 ,这两个
数据结构的定义都可以在 #! 文件中找到。看看 + )
驱动是怎么做的,第一步是填写 ,在 !!;
可以找到填写 的代码,如下:
%?8#====*+/
83
89;9:
8;:
8@AA@BCD,:
8:
83
?8>?:
!?8#====*+
4
4/
这里面的各个数据成员的意思,在 数据结构中有详细的说明,
这里不赘述。上面的代码中的 @AA@BCD, 宏还是比较有意思的,其实是个 的编程技
巧,这个技巧很有用哦!可以在 #?! 中找到它的定义:
&.@AA@BCD,#E#E#FG
该宏可以方便的求出一个数组中有多少数据成员,这在很多情况下是很有用的,比如
对于 FG83:H:%H::::4数组,可以使用该宏求出 FG有 I 个元素。
另外, 的另外一项重要成员是 ,在上面的代码中
此域被赋予了 , 也可以在 !!;
找到。
FG83
FG83
8 JJK@+ ):
8 JJK@+ )$ JJD+ );:
剩余25页未读,继续阅读
资源评论
tjx163
- 粉丝: 18
- 资源: 392
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 同态加密python.zip
- 基于Python的PCA人脸识别算法的原理及实现代码详解+源码+详细代码解析+开发文档+数据(毕业设计&课程设计&项目开发)
- Decision tree20240105(1).ipynb
- zuoyezuoyezuoye
- zuoyezuoyezuoye
- 机械设计电机转子装配设备sw22非常好的设计图纸100%好用.zip
- 作业作业作业作业作业作业
- xdotool.c
- RLMD鲁棒性局部均值分解信号分量可视化(Matlab完整源码和数据)
- Screenshot_2024-04-26-17-17-26-36_9d26c6446fd7bb8e41d99b6262b17def.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功