20.5 构建目标板代码
来源:互联网 发布:qq优化排名群怎么做 编辑:程序博客网 时间:2024/05/17 23:09
20.5 构建目标板代码
Linux内核已经为ARM处理器设计好了代码框架,只要按照这个框架加入针对某种开发板和处理器的代码即可工作。加入代码还是按照前面提到的原则,能使用已有的通用代码尽量使用,并且尽可能地参考现有开发板代码的处理方法。
20.5.1 处理器初始化
首先在mach-mini2440.c文件中加入处理器初始化代码如下:
56 void __init mini2440_init(void)
57 {
58 set_s3c2410ts_info(&mini2440_ts_cfg); // 注册触摸屏结构
59 set_s3c2410udc_info(&mini2440_udc_cfg); // 注册UDC结构
60 set_s3c2410fb_info(&mini2440_lcdcfg); // 注册LCD结构
61 }
在mini2440_init()函数中注册了3个结构,分别用于初始化触摸屏、UDC和LCD,这3个结构都是针对三星ARM9处理器的。接下来定义这三个结构代码如下:
53 static struct s3c2410_ts_mach_info mini2440_ts_cfg __initdata = {
54 .delay = 20000,
55 .presc = 55,
56 .oversampling_shift = 2,
57 };
58
59
60 static struct s3c2410_udc_mach_info mini2440_udc_cfg __initdata = {
61 .udc_command = pullup, // 设置udc处理函数
62 };
63
64
65 static struct s3c2410fb_mach_info mini2440_lcdcfg __initdata = {
66 .regs = { // 设置控制寄存器
67 .lcdcon1 = S3C2410_LCDCON1_TFT16BPP | /
68 S3C2410_LCDCON1_TFT | /
69 S3C2410_LCDCON1_CLKVAL(0x04),
70
71 .lcdcon2 = S3C2410_LCDCON2_VBPD(1) | /
72 S3C2410_LCDCON2_LINEVAL(319) | /
73 S3C2410_LCDCON2_VFPD(5) | /
74 S3C2410_LCDCON2_VSPW(1),
75
76 .lcdcon3 = S3C2410_LCDCON3_HBPD(36) | /
77 S3C2410_LCDCON3_HOZVAL(239) | /
78 S3C2410_LCDCON3_HFPD(19),
79
80 .lcdcon4 = S3C2410_LCDCON4_MVAL(13) | /
81 S3C2410_LCDCON4_HSPW(5),
82
83 .lcdcon5 = S3C2410_LCDCON5_FRM565 |
84 S3C2410_LCDCON5_INVVLINE |
85 S3C2410_LCDCON5_INVVFRAME |
86 S3C2410_LCDCON5_PWREN |
87 S3C2410_LCDCON5_HWSWP,
88 },
89
90 .lpcsel = 0xf82,
91
92 .gpccon = 0xaa955699,
93 .gpccon_mask = 0xffc003cc,
94 .gpcup = 0x0000ffff,
95 .gpcup_mask = 0xffffffff,
96
97 .gpdcon = 0xaa95aaa1, // 设置通用控制寄存器
98 .gpdcon_mask = 0xffc0fff0, // 通用控制寄存器掩码
99 .gpdup = 0x0000faff, // 设置通用控制寄存器
100 .gpdup_mask = 0xffffffff, // 通用控制寄存器掩码
101
102 .fixed_syncs = 1, // 同步
103 .width = 240, // 设置屏幕宽度像素值
104 .height = 320, // 设置屏幕高度像素值
105
106 .xres = { // 设置LCD屏幕横向像素值
107 .min = 240, // 最小值
108 .max = 240, // 最大值
109 .defval = 240, // 默认值
110 },
111
112 .yres = { // 设置LCD屏幕纵向像素值
113 .max = 320, // 最大值
114 .min = 320, // 最小值
115 .defval = 320, // 默认值
116 },
117
118 .bpp = { // 颜色位数
119 .min = 16, // 最小值
120 .max = 16, // 最大值
121 .defval = 16, // 默认值
122 },
123 };
mini2440_ts_cfg结构定义了触摸屏相关参数;mini2440_lcdcfg结构定义了LCD控制器相关参数,S3C2440提供了一组LCD控制器,用于设置LCD的颜色、像素值、数据传输方式、同步方式等结构。读者可以参考S3C2440处理器手册,对照代码中的值得到配置的方式。
%提示:LCD控制器的配置比较复杂,S3C2440提供的LCD控制器仅支持数字信号输入的液晶屏,在连接液晶屏之前需要参考液晶屏的手册。
在mini2440_udc_cfg结构中使用了一个pullup回调函数,定义如下:
52 static void pullup(unsigned char cmd)
53 {
54 switch (cmd)
55 {
56 case S3C2410_UDC_P_ENABLE : // 打开UDC
57 break;
58 case S3C2410_UDC_P_DISABLE : // 关闭UDC
59 break;
60 case S3C2410_UDC_P_RESET : // 重启UDC
61 break;
62 default: break;
63 }
64 }
pullup()函数不做任何处理,如果以后需要添加对UDC的处理可以在pullup()函数中加入处理代码。
20.5.2 端口映射
端口映射函数设置S3C2440处理器的I/O端口描述结构、时钟频率、串口等,代码 如下:
150 void __init mini2440_map_io(void)
151 {
152 s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc)); // 初始化I/O结构
153 s3c24xx_init_clocks(12000000); // 设置时钟频率
154 s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartc
fgs)); // 设置串口结构
155 s3c24xx_set_board(&mini2440_board); // 设置开发板结构
156 s3c_device_nand.dev.platform_data = &bit_nand_info;
157 }
在mini2440_map_io()函数中,初始化了3个结构,定义如下:
66 static struct map_desc mini2440_iodesc[] __initdata = {
67 {vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE},
// 网卡接口映射
68 {0xe0000000, 0x08000000, 0x00100000, MT_DEVICE},
69 {0xe0100000, 0x10000000, 0x00100000, MT_DEVICE},
70 { (unsigned long)S3C24XX_VA_IIS, S3C2410_PA_IIS, S3C24XX_SZ_IIS, MT_ DEVICE },
71 };
72
73 static struct s3c2410_uartcfg mini2440_uartcfgs[] = {
74 [0] = {
75 .hwport = 0, // 串口0
76 .flags = 0,
77 .ucon = 0x3c5,
78 .ulcon = 0x03,
79 .ufcon = 0x51,
80 },
81 [1] = {
82 .hwport = 1, // 串口1
83 .flags = 0,
84 .ucon = 0x3c5,
85 .ulcon = 0x03,
86 .ufcon = 0x51,
87 },
88 [2] = {
89 .hwport = 2, // 红外线接口
90 .flags = 0,
91 .uart_flags = 0,
92 .ucon = 0x3c5,
93 .ulcon = 0x03,
94 .ufcon = 0x51,
95 }
96 };
97
98 static struct s3c24xx_board mini2440_board __initdata = {
99 .devices = mini2440_devices, // 开发板设备列表
100 .devices_count = ARRAY_SIZE(mini2440_devices) // 结构大小
101 };
map_desc结构描述了内存虚拟地址和物理地址之间的关系,供配置MMU使用。mini2440_uartcfgs[]结构描述了开发板上两个串口和一个红外线接口的定义。mini2440_ board结构描述了开发板上存在的设备列表mini2440_devices,定义如下:
66 static struct platform_device *mini2440_devices[] __initdata = {
67 &s3c_device_lcd, // LCD控制器
68 &s3c_device_wdt, // 看门狗控制器
69 &s3c_device_i2c, // I2C控制器
70 &s3c_device_ts, // 触摸屏控制器
71 &s3c_device_nand, // NAND Flash控制器
72 &s3c_device_rtc, // RTC控制器
73 };
在mini2440_devices结构中定义了LCD控制器、看门狗控制器、I2C控制器、触摸屏控制器等结构,这些结构的定义都是使用内核提供的标准结构,定义在devs.c文件中。
20.5.3 中断处理
内核提供了一个s3c24xx_init_irq()处理函数,因此中断处理函数直接引用即可。
186 void __init mini2440_init_irq(void)
187 {
188 s3c24xx_init_irq(); // 调用系统提供的中断处理函数
189 }
20.5.4 定时器处理
内核提供了一个定时器处理函数结构如下。
struct sys_timer s3c24xx_timer = {
.init = s3c2410_timer_init, // 定时器初始化函数
.offset = s3c2410_gettimeoffset, // 获取定时器值
.resume = s3c2410_timer_setup // 恢复定时器设置
};
在代码中直接使用s3c24xx_timer结构即可。
20.5.5 编译最终代码
到目前为止,已经添加了所有与mini2440开发板有关的代码,保存文件后,可以开始编译内核。回到内核代码根目录,执行“make ARCH=arm CROSS_COMPILE=arm-linux- bzImage”重新编译代码,最终在arch/arm/boot目录下生成bzImage文件,针对开发板的内核代码编译成功。
通过U-Boot或者其他的Bootloader工具可以把代码烧写到开发板的Flash存储器上,然后重新启动开发板,可以从液晶屏看到启动过程打印的提示信息。
%提示:由于没有设置USB控制器和声音控制器,因此开发板上和USB及声音相关的功能都无法使用。
- 20.5 构建目标板代码
- (一)项目构建目标
- Webpack构建目标(Targets)
- 文件系统代码分析目标
- 目标代码,可执行文件&库
- 从头构建Linux系统 之 目标读者
- webpack--概念8--manifest+runtime+构建目标
- 目标数量检测MATLAB代码
- 代码本地构建
- Hibernate 构建基础代码
- 如何构建优质代码
- 纯代码构建tabbar
- SWIG构建Jni代码
- ssh代码构建步骤
- 如何构建前端代码
- 如何构建优质代码
- 构建脚本代码
- 目标代码生成与代码优化
- 20.3.2 设置宏与代码文件的对应关系
- ADO.NET常用的方法
- 20.3.3 测试工程框架
- 20.4 建立目标平台代码框架
- 网络无边
- 20.5 构建目标板代码
- 20.6 小 结
- 串口wifi- 无线局域网wlan模块
- 伽利略变换的极限式证明及推论
- C# 动态加载
- xml文件中存取BASE64编码的图片
- C#和.Net的优点、不足浅谈
- 全局临时表何时被Drop?
- crontab命令