三> 支持 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 ** --->
<*> Standard 224-color Linux **
启动时输出:
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,就可以了 |