(续)
二、 NAND flash 分区管理
这块2410板自带了vivi,启动之后可以进到vivi的提示符下:
vivi>
查看分区情况:
vivi> part show
mtdpart info. (6 partitions)
name offset size flag
vivi :0x00000000 0x00020000 0 128k
param :0x00020000 0x00010000 0 64k
kernel :0x00030000 0x00200000 0 2M
root :0x00230000 0x00300000 4 3M
yaffs :0x00530000 0x03a00000 8 58M
使用part命令可以添加、删除各个mtd分区。
另外还有一种分区格式:BON,具体用法参照bon命令帮助即可。2.6内核对mtd分区格式支持的很好,所以这里采用了mtd分区方式。
其中vivi是bootloader区,param是存放启动参数设置区,kernel是内核镜像文件区,root是启动文件系统区,yaffs是文件系统区,可以视情况修改这些区域的大小。
三、 网卡和LCD驱动的移植
1. 网卡驱动移植:
这块板使用的是DM9000的网卡芯片,驱动的源代码在内核源代码的目录中可以找到:
$root@host:/home/arm/# cd kernel/linux-2.6.22
$root@host:/home/arm/kernel/linux-2.6.22# cd drivers/net
$root@host:/home/arm/kernel/linux-2.6.22/drivers/net# ls dm*
dm9000.c dm9000.h
修改dm9000.c:
$root@host:/home/arm/kernel/linux-2.6.22# vi dm9000.c
找到函数:
static int dm9000_probe(struct platform_device *pdev)
{
……….
int ret=0;
int iosize;
int i;
u32 idval
//添加下面数组,前6个数作为网卡的mac地址,注意不能和现有的网卡冲突
unsigned char ne_defethadder[]={0x08,0x08,0x08,0x08,0x12,0x27,0}
………………………….
………………………….
/* Set Node Address */
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = db->srom[i];
if (!is_valid_ether_addr(ndev->dev_addr)) {
/* try reading from mac */
for (i = 0; i < 6; i++)
//修改mac地址
// ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
ndev->dev_addr[i]=ne_defethaddr[i];
………………………
……………………….
}
退出保存。
修改smdk2410.c:
$root@host:/home/arm/kernel/linux-2.6.22# cd arch/arm/mach-s3c2410
$root@host:/home/arm/kernel/linux-2.6.22/arch/arm/mach-s3c2410#
vi mach-smdk2410.c
在mach-smdk2410.c中添加如下内容:
…………
#include <asm/plat-s3c24xx/common-smdk.h>
//添加:
#include <linux/dm9000.h>
…………
………….
#define UCON S3C2410_UCON_DEFAULT
#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
//添加:
static struct resource s3c_d9k_resource[]=
{
[0]={
.start =0x10000000,
.end =0x10000000,
.flags=IORESOURCE_MEM
},
[1]={
.start =0x10000000+0x2,
.end =0x10000000+0x2,
.flags=IORESOURCE_MEM
},
[2]={
.start =IRQ_EINT2,
.end =IRQ_EINT2,
.flags =IORESOURCE_IRQ
}
};
static struct dm9000_plat_data s3c_device_d9k_platdata = {
.flags= DM9000_PLATF_16BITONLY
};
struct platform_device s3c_device_d9k = {
.name= "dm9000",
.id= 0,
.num_resources= ARRAY_SIZE(s3c_d9k_resource),
.resource= s3c_d9k_resource,
.dev= {
.platform_data = &s3c_device_d9k_platdata,
}
};
………………….
………………….
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
//启动lcd
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
//添加
&s3c_device_d9k
//&s3c_device_ts,
};
需要注意的是起始地址和中断号的选择。这块板上DM9000芯片的INT引脚接的是EINT2,CMD引脚接的是A1,CS引脚接的是nGCS2,所以DM9000的index端口地址是0x10000000,data端口地址是0x10000000+0x00000002,据此设置结构resource s3c_d9k_resource中的参数。最后在内核编译时加上对DM9000驱动的支持就可以了,具体见内核配置和编译。
2. LCD驱动移植:
继续在mach-smdk2410.c中添加如下内容:
………….
#include <asm/arch/fb.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/regs-lcd.h>
………….
………….
static struct s3c2410fb_mach_info smdk2410_lcdcfg __initdata={
.type=S3C2410_LCDCON1_TFT,
.fixed_syncs= 0,
.regs={
.lcdcon1= S3C2410_LCDCON1_TFT16BPP|
S3C2410_LCDCON1_TFT |
S3C2410_LCDCON1_CLKVAL(0X01), /*HCLK/4*/
.lcdcon2= S3C2410_LCDCON2_VBPD(18)| /*19*/
S3C2410_LCDCON2_LINEVAL(479)|
S3C2410_LCDCON2_VFPD(10)| /*11*/
S3C2410_LCDCON2_VSPW(14), /*15*/
.lcdcon3= S3C2410_LCDCON3_HBPD(43)|
S3C2410_LCDCON3_HOZVAL(639)| /*640*/
S3C2410_LCDCON3_HFPD(115), /*116*/
.lcdcon4= S3C2410_LCDCON4_MVAL(0) |
S3C2410_LCDCON4_HSPW(95), /*96*/
.lcdcon5= S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE|
S3C2410_LCDCON5_INVVFRAME|
S3C2410_LCDCON5_PWREN|
S3C2410_LCDCON5_HWSWP,
},
.lpcsel= ((0XCE6)&~7)|1<<4,//0x0,
.gpccon= 0xAA8002A8,//0xaaaaaaaa,
.gpccon_mask= 0xFFC003FC,//0xffffffff,
.gpcup= 0xF81E,//0xffffffff,
.gpcup_mask= 0xF81E,//0xffffffff,
.gpdcon= 0xAA80AAA0,//0xaaaaaaaa,
.gpdcon_mask= 0xFFC0FFF0,//0x0,
.gpcup= 0xF8FC,//0xffffffff,
.gpcup_mask= 0xF8FC,//0xffffffff,
.width= 640,//240,
.height= 480,//320,
.xres= {640,640,640},//{240,240,240}, .min .max .defval
.yres= {480,480,480},//{320,320,320},
.bpp= {16,16,16}, //{16,16,16},
};
……………
……………
static void __init smdk2410_init(void)
{
s3c24xx_fb_set_platdata(&smdk2410_lcdcfg);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
}
………………..
注:注释掉drivers/char/vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则lcd会在10分钟左右关掉显示。“
最后在内核编译时需要选中对LCD的支持,具体见内核配置和编译。
(待续.....)