三> 支持 yaffs2 文件系统 下载 yaffs2 源码(在光盘资料/源码包/其他软件源码/目录下) 解压,进入 yaffs2 目录: #tar xzvf yaffs2.tar.gz #cd cvs/yaffs2/ 给内核打上 yaffs2 文件系统的补丁,执行: #./patch-ker.sh c /技/linux-2.6.31/ ?这个是你的内核源码的目录 这时内核源码 fs 目录下多了一个 yaffs2 目录,同时 Makefile 文件和 Kconfig 文件也增加了 yaffs2 的配置和编译条件。 配置对 yaffs2 支持: 这部分配置的比较多,可根据自己的需要进行配置,把不用的文件系统都去掉, 下面是几个主要的配置: File systems ---> DOS/FAT/NT Filesystems ---> <*> MSDOS fs support <*> VFAT (Windows95) fs support Miscellaneous filesystems ---> <*> YAFFS2 file system support [*] Autoselect yaffs2 format 配置语言选项: Native Language support ---> (iso8859-1) Default NLS Option <*> Codepage 437(United States, Canada) <*> Simplified Chinese charset(CP936, GB2312) <*> NLS ISO8859-1 (Latin 1; Western European Language) <*> NLS UTF-8 说明:现在内核已经支持 NandFlash 和 yaffs2 文件系统,将内核烧入 NandFlash 后,再烧入 yaffs2 文件系统,可以使用制作好的文件系统,也可以自己制作,详细 的制作文件系统方法,请查看《文件系统制作手册》 启动时(成功挂载文件系统)输出: yaffs: dev is 32505858 name is "mtdblock2" yaffs: passed flags "" yaffs: Attempting MTD mount on 31.2, "mtdblock2" yaffs: auto selecting yaffs2 yaffs_read_super: isCheckpointed 0 VFS: Mounted root (yaffs filesystem) on device 31:2. Freeing init memory: 196K 四> LCD 驱动的移植 内核里已经有很完善的 LCD 驱动了,只要根据所用的 LCD 进行简单的修改,在 内核源码 drivers/video/s3c2410fb.c 是 LCD 驱动的源码,首先要设置 LCD 的时钟 频率,有一个计算公式,很复杂,不用管它,直接修改程序实现。 在第 365 行开始的函数: static void s3c2410fb_activate_var(struct fb_info *info) { struct s3c2410fb_info *fbi = info->par; void __iomem *regs = fbi->io; int type = fbi->regs.lcdcon1 & S3C2410_LCDCON1_TFT; struct fb_var_screeninfo *var = &info->var; struct s3c2410fb_mach_info *mach_info = fbi->dev->platform_data; struct s3c2410fb_display *default_display = mach_info->displays + mach_info->default_display; int clkdiv = s3c2410fb_calc_pixclk(fbi, var->pixclock) / 2; dprintk("%s: var->xres = %d\n", __func__, var->xres); dprintk("%s: var->yres = %d\n", __func__, var->yres); dprintk("%s: var->bpp = %d\n", __func__, var->bits_per_pixel); if (type == S3C2410_LCDCON1_TFT) { s3c2410fb_calculate_tft_lcd_regs(info, &fbi->regs); --clkdiv; if (clkdiv < 0) clkdiv = 0; } else { s3c2410fb_calculate_stn_lcd_regs(info, &fbi->regs); if (clkdiv < 2) clkdiv = 2; } // fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(clkdiv); fbi->regs.lcdcon1 |= S3C2410_LCDCON1_CLKVAL(default_display->setclkval); 这几句是在 s3c2410fb_display 结构体中加入了 setclkval 变量,我们需要在结构 体原型中加入这个变量,在 arch/arm/mach-s3c2410/include/mach/fb.h 中第 40 行 加入:unsigned setclkval; /*clkval*/ 说明:在视频教程中修改 s3c2410fb.c 文件时,和手册上有一点误差,手册上写的 是正确的,请按照手册上操作 修改 LCD 参数配置:(这个要查看所用 LCD 的手册来确定参数) 修改 arch/arm/mach-s3c2440/mach-smdk2440.c 中第 107 行的结构体,我修改的参 数如下: static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = { .lcdcon5 = S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, .width .height = 320, = 240, .pixclock = 100000, /* HCLK 60 MHz, divisor 10 */ .setclkval = 0x3, /*add by xgc*/ .xres .yres .bpp = 320, = 240, = 16, .left_margin = 19, .right_margin = 24, .hsync_len = 44, .upper_margin = 7, .lower_margin = 5, .vsync_len = 15, }; 屏蔽掉第 150 行的语句: // .lpcsel = ((0xCE6) & ~7) | 1<<4, 配置内核,支持 LCD: Device Drivers: Graphics Support ---> <*>support for frame buffer devices ---> [*] Enable frameware EDID [*] Enable Vidoe Mode Handling Helpers 11 <*> S3C24X0 LCD framebuffer support Console display driver support ---> <*> Framebuffer Console Support [*] Bootup Logo ---> <*> Standard 224-color Linux logo 启动时输出: Console: switching to colour frame buffer device 40x30 fb0: s3c2410fb frame buffer device 添加对 7 寸 LCD 的支持: 我们使用的 7 寸屏是群创的 AT070TN83 V.1(带触摸屏),分辨率是 800X480。 同样修改 arch/arm/mach-s3c2440/mach-smdk2440.c 中第 107 行的结构体,加入 7 寸屏的配置参数: static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = { .lcdcon5 = S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP, .type = S3C2410_LCDCON1_TFT, #if defined(CONFIG_FB_S3C2410_W35) .width .height = 320, = 240, .pixclock = 100000, /* HCLK 60 MHz, divisor 10 */ .setclkval = 0x3, /*add by xgc*/ .xres .yres .bpp = 320, = 240, = 16, .left_margin = 19, .right_margin = 24, 12 .hsync_len = 44, .upper_margin = 7, .lower_margin = 5, .vsync_len = 15, #elif defined(CONFIG_FB_S3C2410_Q70) .width .height = 800, = 480, .pixclock = 40000, /* HCLK 40 MHz*/ .setclkval = 0x1, /*add by xgc*/ .xres .yres .bpp = 800, = 480, = 16, .left_margin = 40, /*HFPD*/ .right_margin = 40, /*HBPD*/ .hsync_len = 48, /*HSPW*/ .upper_margin = 13, /*VFPD*/ .lower_margin = 29, /*VBPD*/ .vsync_len = 3, /*VSPW*/ #endif }; 修改 drivers/video/Kconfig 文件,在 1942 行加入: choice prompt "LCD size select" depends on FB_S3C2410 help s3c2410 lcd size select config FB_S3C2410_W35 boolean"The 3.5 inch LCD with resolution 320X240" depends on FB_S3C2410 help 3.5 inch LCD 320X240 13 config FB_S3C2410_Q70 boolean"The 7 inch LCD with resolution 800X480" depends on FB_S3C2410 help 7 inch LCD 800X480 endchoice config FB_S3C2410_DEBUG bool "S3C2410 lcd debug messages" depends on FB_S3C2410 help Turn on debugging messages. Note that you can set/unset at run time through sysfs 配置内核,支持 7 寸 LCD: Device Drivers: Graphics Support ---> <*>support for frame buffer devices ---> <*> S3C24X0 LCD framebuffer support LCD size select(The 3.5 inch LCD with resolution 320X240) ---> 进入"LCD size select(The 3.5 inch LCD with resolution 320X240)--->"选项, 在这里选择不同的 LCD 类型(默认的是 3.5 寸屏),按空格键即可选中,前面有"X" 的表示选中的,如果我们要选择 7 寸屏,将光标移至第二行,按空格键,就选中了 对 7 寸屏的支持 ( )The 3.5 inch LCD with resolution 320X240 (X)The 7 inch LCD with resolution 800X480 五> DM9000 驱动的移植 修改 arch/arm/mach-s3c2440/mach-smdk2440.c 158行 Platform_device 结构体中,加入: &s3c_device_dm9000, 修改 arch/arm/plat-s3c24xx/devs.c 在最前面 38 行加入: #include <linux/dm9000.h> //别忘加这个头文件 /*DM9000*/ static struct resource s3c_dm9000_resource[] = { [0] = { .start = S3C2410_CS4, .end = S3C2410_CS4 + 3, .flags = IORESOURCE_MEM, }, [1] = { .start = S3C2410_CS4 + 4, .end = S3C2410_CS4 + 4 + 3, .flags = IORESOURCE_MEM, }, [2] = { .start = IRQ_EINT18, /*use eint18 GPG10*/ .end = IRQ_EINT18, .flags = IORESOURCE_IRQ, } }; static struct dm9000_plat_data s3c_dm9000_platdata = { .flags = DM9000_PLATF_16BITONLY, }; static struct platform_device s3c_device_dm9000 = { .name = "dm9000", .id = 0, .num_resources = ARRAY_SIZE(s3c_dm9000_resource), .resource = s3c_dm9000_resource, .dev = { .platform_data = &s3c_dm9000_platdata, } }; EXPORT_SYMBOL(s3c_device_dm9000); 在 arch/arm/plat-s3c/include/plat/devs.h 中加入一行: extern struct platform_device s3c_device_dm9000; 编译时出现一个奇怪的错误: arch/arm/plat-s3c24xx/devs.c:63: error: static declaration of 's3c_device_dm9000' follows non-static declaration arch/arm/plat-s3c/include/plat/devs.h:27: error: previous declaration of 's3c_device_dm9000' was here s3c_device_dm9000 首先在 devs.c 中定义,在 devs.h 中声明,在 mach-s3c2440.c 中使用,看了好几遍代码,应该没什么问题。查不到什么原因,我觉得是跟编译器 有关,在 devs.c 中做了一下修改,问题解决,编译时只出现一个 warning 把 devs.c 中的这句: static struct platform_device s3c_device_dm9000 = { 的 static 改成 extern,就可以了 |