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个结构,分别用于初始化触摸屏、UDCLCD,这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及声音相关的功能都无法使用。

原创粉丝点击