Ubuntu下arm交叉编译环境的创建及基于s3c2410的linux2.6.22移植(二)

(续)

二、 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分区方式。

       其中vivibootloader区,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引脚接的是EINT2CMD引脚接的是A1CS引脚接的是nGCS2,所以DM9000index端口地址是0x10000000data端口地址是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.cblank_screen_t(unsigned long dummy)的函数内容,否则lcd会在10分钟左右关掉显示。

最后在内核编译时需要选中对LCD的支持,具体见内核配置和编译。

  (待续.....)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值