由于linux已经对mini2440提供了支持,这里只做少许的修改。
1、我的移植原则
(1)能用模块方式就用模块方式,尽可能少地向内核添加文件
(2)修改最少的代码,且在修改时使用条件编译
2、移植步骤
(1)为内核打上yaffs2补丁
./patch-ker.sh c m ../linux-2.6.38.7
(2)配置内核
make mini2440_defconfig ARCH=arm
make ARCH=arm menuconfig
(3)修改arch/arm/mach-s3c2440/mach-mini2440.c
修改LCD参数:
如果使用默认的LCD参数,在我的LCD上(T35)向右偏移了很多,这里做如下修改
static struct s3c2410fb_display mini2440_lcd_cfg[] __initdata = {
[0] = { /* mini2440 + 3.5" TFT + touchscreen */
_LCD_DECLARE(
7, /* The 3.5 is quite fast */
240, 21, 38, 6, /* x timing */
320, 4, 4, 2, /* y timing */
240, 1, 26, 5, /* x timing */
320, 2, 5, 2, /* y timing */
修改backlight
将static char mini2440_features_str[12] __initdata = "0tb";
改为static char mini2440_features_str[12] __initdata = "0t";
即不使用backlight,因为如果使用backlight的话,LCD会熄灭背光,直到加载友善之臂提供的backlight驱动。
修改IIC:删除IIC相关内容
如果采用内核默认的IIC,友善提供的EEPROM读写程序将不能执行,只有去除IIC相关内容或将24c08的地址改为0xA0后才能使用,具体原因尚不清楚,需要阅读内核源代码。
关于LED和Button
Linux的LED驱动还是比好的,比如读写nand或mmc时LED就会亮,而button则使用了输入子系统,如将KEY1设置为KEY_RIGHT,则按KEY1时Qt的选择的图标就会向右移动。我的选择是将LED1设为nandread触发,LED2设为mmc触发,LED3和LED4留出来做其他使用。
button设置如下:
static struct gpio_keys_button mini2440_buttons[] = {
{
.gpio = S3C2410_GPG(0), /* K1 */
.code = KEY_UP,
.desc = "Button 1",
.active_low = 1,
},
{
.gpio = S3C2410_GPG(3), /* K2 */
.code = KEY_DOWN,
.desc = "Button 2",
.active_low = 1,
},
{
.gpio = S3C2410_GPG(5), /* K3 */
.code = KEY_LEFT,
.desc = "Button 3",
.active_low = 1,
},
{
.gpio = S3C2410_GPG(6), /* K4 */
.code = KEY_RIGHT,
.desc = "Power",
.active_low = 1,
},
{
.gpio = S3C2410_GPG(7), /* K5 */
.code = KEY_SPACE,
.desc = "Button 5",
.active_low = 1,
},
/* this pin is also known as TCLK1 and seems to already
* marked as "in use" somehow in the kernel -- possibly wrongly */
{
.gpio = S3C2410_GPG(11), /* K6 */
.code = KEY_ESC,
.desc = "Button 6",
.active_low = 1,
},
};
虽然内核默认注释掉了K6,但是开启后没有出现问题。
内核提供了input子系统的button程序,但内核将button创建为input0,这样Qt默认使用button而不能再使用友善提供的触摸屏驱动,这里button采用模块方式,在加载模块时先加载触摸屏,再加载gpio-keys.ko