??xml version="1.0" encoding="utf-8" standalone="yes"?>
2 {
3 char driver_name[]="s3c_fb";
4 int ret;
5 int index=0;
6
7 for(index=0; index<S3C_FB_NUM; index++){ //遍历每一个fb,我们里只有一个lcd.
8 s3c_fb_init_fbinfo(&info[index], driver_name, index);
9
10 if(index==0){ //操作主lcd
11 s3c_fb_backlight_power(1); //开启背光,lcd甉|源,开启背光等?
12 s3c_fb_lcd_power(1);
13 s3c_fb_backlight_level(DEFAULT_BACKLIGHT_LEVEL);
14
15 dprintk("dev FB init\n");
16
17 //映射内存区域
18 if (!request_mem_region((unsigned long)S3C_VA_LCD, SZ_1M, "s3c-lcd")) {
19 ret = -EBUSY;
20 goto dealloc_fb;
21 }
22
23 dprintk("got LCD region\n");
24
25 //打开lcd_clock
26 lcd_clock = clk_get(NULL, "lcd");
27 if (!lcd_clock) {
28 printk(KERN_INFO "failed to get lcd clock source\n");
29 ret = -ENOENT;
30 goto release_irq;
31 }
32
33 clk_enable(lcd_clock);
34 printk("S3C_LCD clock got enabled :: %ld.%03ld Mhz\n", print_mhz(clk_get_rate(lcd_clock)));
35
36 msleep(5);
37 }
38
39 //甌昑֭
40 /* Initialize video memory */
41 ret = s3c_fb_map_video_memory(&info[index]);
42 if (ret) {
43 printk("Failed to allocate video RAM: %d\n", ret);
44 ret = -ENOMEM;
45 goto release_clock;
46 }
47 dprintk("got video memory\n");
48
49 //初始化寄存器Q这里与具体的设备有兟?/span>
50 ret = s3c_fb_init_registers(&info[index]);
51 ret = s3c_fb_check_var(&info[index].fb.var, &info[index].fb);
52
53 //所谓的色表Q调色盘Q)Q不清除是干啥的?/span>
54 if(index<2){
55 /* 2007-01-09-Tue. for RGB 8-8-8 palette*/
56 if(fb_alloc_cmap(&info[index].fb.cmap, 256, 0)<0){
57 goto dealloc_fb;
58 }
59 }
60 else{
61 /* 2007-01-09-Tue. for RGB 8-8-8 palette*/
62 if(fb_alloc_cmap(&info[index].fb.cmap, 16, 0)<0){
63 goto dealloc_fb;
64 }
65 }
66 //注册framebuffer??
67 ret = register_framebuffer(&info[index].fb);
68 if (ret < 0) {
69 printk(KERN_ERR "Failed to register framebuffer device: %d\n", ret);
70 goto free_video_memory;
71 }
72 }// for(index=0; index<CONFIG_FB_NUM; index++)
73
74 // initialize the struct for Waitforvsync
75 // 关于中断的初始化工作Q貌?412是注册以后又取消?/span>
76 s3cfb_vSyncInfo.count = 0;
77 init_waitqueue_head(&s3cfb_vSyncInfo.waitQueue);
78
79 #if defined(CONFIG_ARCH_S3C2443)
80 ret = request_irq(IRQ_LCD3, s3c_fb_irq, 0, "s3c-lcd", pdev);
81 #elif defined(CONFIG_ARCH_S3C6400)
82 ret = request_irq(IRQ_LCD_VSYNC, s3c_fb_irq, 0, "s3c-lcd", pdev);
83 #elif defined (CONFIG_S3C_DVS) && defined (CONFIG_ARCH_S3C2412)
84 ret = request_irq(IRQ_LCD, s3c_dvs_irq, 0, "s3c-lcd", pdev);
85 #endif
86 if (ret != 0) {
87 printk("Failed to install irq (%d)\n", ret);
88 goto release_irq;
89 }
90
91 #if defined (CONFIG_S3C_DVS) & defined (CONFIG_ARCH_S3C2412)
92 disable_irq(IRQ_LCD);
93 #endif
94
95 //在sys底下建立节点Q用于和用户I间交互
96 /* create device files */
97 device_create_file(&(pdev->dev), &dev_attr_backlight_power);
98 device_create_file(&(pdev->dev), &dev_attr_backlight_level);
99 device_create_file(&(pdev->dev), &dev_attr_lcd_power);
100
101 //胜利退?/span>
102 printk(KERN_INFO "fb%d: %s frame buffer device\n",
103 info[index].fb.node, info[index].fb.fix.id);
104 return 0;
105
106 free_video_memory:
107 s3c_fb_unmap_video_memory(&info[index]);
108
109 release_clock:
110 clk_disable(lcd_clock);
111 clk_put(lcd_clock);
112
113 release_irq:
114 #if defined(CONFIG_ARCH_S3C2443)
115 free_irq(IRQ_LCD3, &info);
116 #elif defined(CONFIG_ARCH_S3C6400)
117 free_irq(IRQ_LCD_VSYNC, &info);
118 #endif
119 //release_mem:
120 release_mem_region((unsigned long)S3C_VA_LCD, S3C_SZ_LCD);
121
122 dealloc_fb:
123 framebuffer_release(&info[index].fb);
124 return ret;
125 }
126
127
128
]]>
Q待l)
我用的不是SMDK2412的开发板Q而是公司已经?412的机器,原来用的是自q一个OSQ现在打在他上面运行linux.
~译2.6的内核,需要比较新的gcc, 我暂时能扑ֈ的新版arm-linux-gcc也就?.4.1。,之前用arm-none-linux-eabi-gcc 4.1~出来的zImage好大Q基本不能用。对于开发工具和内核版本Q我觉得q是新好Q稳定版Q,否则可能会遇C些稀奇古怪的问题?/p>
1.修改Boot
使用公司原有的Boot, 在Boot启动Kernel的时候,加入的参数设定,然后用公怸用的usb更新工具烧录kernel到flash中,启动机器以后昄了一堆ؕ码,在启动参?console=ttySAC0后面加上?115200Q设定L特率以后一切OK.
2.MTD分区Q修Ҏ件common-smdk.c Q?修改其中的MTD讑֤的分区?/p>
新的kernel里面已经有了默认分区表,我们只要Ҏ我们需要来做部分修改就可以Q我的nand?12MBQ?我目前只是将前面?M分给boot,kernel, 紧接下来?M分给rootfsQ打暂时加载一?单的cramfs。其他的nand都还没有用?/p>
3.取消NAND驱动中的ECCL验,以及坏块监测部分, 因ؓNAND操作部分Qboot和kernel有一些不同?/p>
重启以后Qmount root分区p|Q还打出了I/O 错误?关闭了ECC校验Q修改了pc工具的烧录地址以后Qok. q都是因为我们的烧录工具使用的地址表示Ҏ和ecc的方式有一些不同?/p>
4.烧录 root 文gpȝ?/p>
拿了一个在kernel2.4 2440 上用q得cramfs直接来用Q提C找不到dev/consoleQ?上网查了一遍,应该是因为现在新版的kernelL了devfs的缘故,Z先快速的有一个可执行环境Q所以在|上找了一个现成的Q已l自己徏立好节点的cramfsQ里面的busybox版本也比较新?
开行,ȝ见到了亲qshell.
q是我在ITjob培训|上扑ֈ的课E大UԌ觉得作ؓ嵌入式系l开发的学习步骤Q按部就班地L行和学习Q到不失ZU好的学习方法:Q?/p>
q是作为参考也是有很好的h值的Q?/p>
随着CC会信息化进E的加快Q嵌入式pȝ被广泛的地应用于军事、家用、工业、商业、办公、医疗等C会各个?
面,表现出很强的投资价倹{从国际范围来看Q作为数字化电子信息产品核心的嵌入式pȝ目前其硬件和软g开发工具市场已l突?font face="文鼎Qͼ中楷, serif">2000亿美元,嵌入式系l带
来的全球工业q值更是达C一万亿元Q随着全球l济的持l增长以及信息化的加速发展,嵌入式系l市场必进一步增ѝ?font face="文鼎Qͼ中楷, serif">
本课E是Z适应目前发展q速的嵌入?font face="文鼎Qͼ中楷, serif">Linux需求而设计,评目标是让学员辑ֈ适应嵌入式应用Y件开发、嵌入式pȝ开发或嵌入式驱动开发的基本素质?
评循序渐进的带领您嵌入式开发的世界Q采用了目前应用最q泛的Yg开发^収ͼLinux?font face="文鼎Qͼ中楷, serif">ArmQ,可以保证您尽量脓q目前企业需求?/p>
学习步骤如下Q(一步步来哦Q)
1、Linux
基础
安装Linux操作pȝ
Linux文gpȝ
Linux常用命o
Linux启动q程详解
熟悉Linux服务
能够独立安装Linux操作pȝ
能够熟练使用Linuxpȝ的基本命?
认识Linuxpȝ的常用服?
安装Linux操作pȝ
Linux基本命o实践
讄Linux环境变量
定制Linux的服?
Shell ~程基础
使用vi~辑文g
使用Emacs~辑文g
使用其他~辑?
2、Shell ~程基础
Shell?
认识后台E序
Bash~程
熟悉Linuxpȝ下的~辑环境
熟悉Linux下的各种Shell
熟练q行shell~程
熟悉vi基本操作
熟悉Emacs的基本操?
比较不同shell的区?
~写一个测试服务器是否q通的shell脚本E序
~写一个查看进E是否存在的shell脚本E序
~写一个带有@环语句的shell脚本E序
3、Linux 下的 C ~程基础
linux
C语言环境概述
Gcc使用Ҏ
Gdb调试技?
Autoconf
Automake
Makefile
代码优化 熟悉Linuxpȝ下的开发环?
熟悉Gcc~译?
熟悉Makefile规则
~写Hello,WorldE序
使用
make命o~译E序
~写带有一个@环的E序
调试一个有问题的程?
4、嵌入式pȝ开发基
嵌入式系l概q?
交叉~译
配置TFTP服务
配置NFS服务
下蝲Bootloader和内?
嵌入?font face="文鼎Qͼ中楷, serif">Linux应用软g开发流E?br>熟悉嵌入式系l概念以及开发流E?
建立嵌入式系l开发环?
制作cross_gcc工具?
~译q下?font face="文鼎Qͼ中楷, serif">U-boot
~译q下?font face="文鼎Qͼ中楷, serif">Linux内核
~译q下?font face="文鼎Qͼ中楷, serif">Linux应用E序
4、嵌入式pȝUL
Linux内核代码
q_相关代码分析
ARMq_介绍
q_UL的关键技?
ULLinux内核?
ARMq_ 了解UL的概?
能够ULLinux内核
ULLinux2.6内核?
ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概?
嵌入?font face="文鼎Qͼ中楷, serif">Linux应用软g开发流E?
Linuxpȝ的文件和讑֤
与文件相关的pȝ调用
配置l端?font face="文鼎Qͼ中楷, serif">MiniCOM
能够熟悉q行串口通信
熟悉文gI/O
~写串口通信E序
~写多串口通信E序
6、嵌入式pȝ中多q程E序设计
Linuxpȝq程概述
嵌入式系l的q程特点
q程操作
守护q程
相关的系l调?
了解Linuxpȝ中进E的概念
能够~写多进E程?
~写多进E程?
~写一个守护进E程?
sleeppȝ调用
d理、同步与通信 Linuxd概述
d调度
道
信号
׃n内存
d理 API
了解Linuxpȝd理机制
熟悉q程间通信的几U方?
熟悉嵌入?font face="文鼎Qͼ中楷, serif">Linux中的d间同步与通信
~写一个简单的道E序实现文g传输
~写一个用共享内存的E序
7、嵌入式pȝ中多U程E序设计
U程的基知识
多线E编E方?
U程应用中的同步问题
了解U程的概?
能够~写单的多线E程?
~写一个多U程E序
8、嵌入式 Linux |络~程
|络基础知识
嵌入?font face="文鼎Qͼ中楷, serif">Linux?font face="文鼎Qͼ中楷, serif">TCP/IP|络l构
socket ~程
常用 API函数
分析Ping命o的实?
基本UDP套接口编E?
许可证管?
PPP协议
GPRS
了解嵌入?font face="文鼎Qͼ中楷, serif">Linux|络体系l构
能够q行嵌入?font face="文鼎Qͼ中楷, serif">Linux环境下的socket
~程
熟悉UDP协议?font face="文鼎Qͼ中楷, serif">PPP协议
熟悉GPRS
使用socket ~写代理服务?
使用socket
~写路由?
~写许可证服务器
指出TCP?font face="文鼎Qͼ中楷, serif">UDP的优~点
~写一?font face="文鼎Qͼ中楷, serif">web服务?
~写一个运行在
ARMq_的网l播攑֙
9、GUI E序开?/span>
GUI基础
嵌入式系l?font face="文鼎Qͼ中楷, serif">GUIcd
~译QT
q行QT开?
熟悉嵌入式系l常用的GUI
能够q行QT~程
使用QT~写“HelloQ?font face="文鼎Qͼ中楷, serif">World”E序
调试一个加入信?font face="文鼎Qͼ中楷, serif">/槽的实例
通过重蝲QWidget
cL法处理事?
10、Linux 字符讑֤驱动E序
讑֤驱动E序基础知识
Linuxpȝ的模?
字符讑֤驱动分析
fs_operationl构
加蝲驱动E序
了解讑֤驱动E序的概?
了解Linux字符讑֤驱动E序l构
能够~写字符讑֤驱动E序
~写Skull驱动
~写键盘驱动
~写I/O驱动
分析一个看门狗驱动E序
ҎLinux2.6内核?font face="文鼎Qͼ中楷, serif">2.4内核中字W设备驱动的不同
Linux 块设备驱动程?
块设备驱动程序工作原?
典型的块讑֤驱动E序分析
块设备的dh队列
了解Linux块设备驱动程序结?
能够~写单的块设备驱动程?
比较字符讑֤与块讑֤的异?
~写MMC卡驱动程?
分析一个文件系l?
ҎLinux2.6内核?font face="文鼎Qͼ中楷, serif">2.4内核中块讑֤驱动的不?
11、文件系l?/span>
虚拟文gpȝ
文gpȝ的徏?
ramfs内存文gpȝ
proc文gpȝ
devfs 文gpȝ
MTD技术简?
MTD块设备初始化
MTD块设备的d操作
了解Linuxpȝ的文件系l?
了解嵌入?font face="文鼎Qͼ中楷, serif">Linux的文件系l?
了解MTD技?
能够~写单的文gpȝ
?ARM9开发板d
MTD支持
ULJFFS2文gpȝ
通过proc文gpȝ修改操作pȝ参数
分析romfs
文gpȝ源代?
创徏一?font face="文鼎Qͼ中楷, serif">cramfs
文gpȝ
转眼_从事E序员这一行已l两q半了?/p>
记得上中学的时候,刚接触了电脑Q在体验了Windows得神奇以后,我就开始立志,希望来能成Z个Y件工E师。那Ӟ在我的每本课本得W一,除了会写上我自己的名字以外,q会有一行用钢笔写下的黑体字 “我的未来,我的Microsoft??
大学毕业以后q入一家普通的软g公司Q浑噩噩得q着Coding & Debug 的日子。不知道工作是ؓ了谁Q也不知道工作是Z什么,只知道我只是一个程序员。h没有目标和理惻I是行尸走肉Q而我Q就是这样一个臭皮囊Q已l恍惚了q么多年?/p>
有一天,l于又重新打开求职的网,又看C那个从前在心目中无比圣的LogoQ那个永q的Microsoft?/p>
我终于明白了那时的梦惟뀂其实我真正惌的,是能够像Microsoft一P能够被更多的人需要,能够对h们的生活有积极得影响Q这才是我工作和人生的h倹{?
觉得为时已晚的时?恰恰是最早的时候?/p>
q好Q我q年轅R?
我的未来Q我的Microsoft?/p>