移植Linux2.6.24.7到博创2410-S(含AX88796驱动及mdev支持)_第1页
移植Linux2.6.24.7到博创2410-S(含AX88796驱动及mdev支持)_第2页
移植Linux2.6.24.7到博创2410-S(含AX88796驱动及mdev支持)_第3页
移植Linux2.6.24.7到博创2410-S(含AX88796驱动及mdev支持)_第4页
移植Linux2.6.24.7到博创2410-S(含AX88796驱动及mdev支持)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、移植Linux到博创2410-S(含AX88796驱动及mdev支持)操作系统:ubuntu9.04交叉编译工具:arm-linux-gcc-4.1.1开发板:2410-S(s3c2410s)注意:蓝色为命令,橘红色为要添加或修改的代码和脚步,浅绿色是对mdev的支持,红色为要注意的地方本文使用mdev(udev的BusyBox简化版),并且不再额外添加代码使内核能够支持devfs(devfs是linux-2.6.12及其以前版本的设备文件系统,但是在linux-2.6.13及其以后的版本中用的是udev。既然已经淘汰了,就不要再添加回来了)。使内核能够支持devfs,主要目的

2、是使内核启动后并在/sbin/init运行之前能自动挂载/dev为devfs文件系统。这样可以避免没有控制台(控制台设备文件)可供init用来按照inittab 的指示开一个shell。本人使用了另一种方法来避免这一问题:直接将串口0/devs3c2410_serial0当/dev/console,这样在mdev -s还没执行前(mdev -s通过扫描/sys/class目录下,所有的dev属性文件,并从这些dev属性文件获取到设备的主次设备号,再为其在/dev目录下创建相应的设备节点。mdev -s还没执行前,/dev目录下一般只有/dev/console、 /dev/null。这两个设备文

3、件是init至少要用到的)init就可以直接使用/dev/console作为控制台开一个shell。因此,本文制作的内核可能需要有一定根文件系统的特殊要求,可参考本人另一篇文章使用BusyBox制作linux根文件系统(CramFS+mdev:若你还是想用devfs,可参考另一篇文章移植Linux到博创2410-S(s3c2410s),包括AX88796移植:一、下载并解压Linux内核源码从网上下载linux-内核源码到/arm2410s目录下,并解压lingdubuntu:/arm2410s$ tar xzvf linux.t

4、ar.gzlingdubuntu:/arm2410s$ cd linux进入内核解压后的目录注:以后示例中,只要是相对路径全部是相对于/arm2410s/linux/此目录内核下载地址:/pub/linux/kernel/v2.6/二、修改内核源码根目录下的Makefile文件lingdubuntu:/arm2410s/linux-$ vi Makefile修改Makefile中的ARCH和CROSS_COMPILE变量,修改为ARCH = armCROSS_COMPILE = arm-linux- /该值

5、是交叉编译器的前缀,具体值因人而异注:arm和arm-linux-后面不能有空格,否则make menuconfig时会出现“/arm2410s/linux-/arch/arm: 是一个目录”错误。三、设置nand flash分区信息修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash的硬件信息(这部分信息应该与vivi中的flash(mtd)分区对应起来,不可随便设置)。 (LED 器件的初始化也在这个文件里,但是博创的平台没有那四个LED管,所以要不要那些程序都无所谓。我就把它们放在那里,反

6、正启动时不会有影响,也没有出错信息。)修改的内容如下:static struct mtd_partition smdk_default_nand_part = 0 = .name = "vivi",.size = SZ_128K,.offset = 0,1 = .name = "param",.offset = SZ_128K,.size = SZ_1M-SZ_128K,2 = .name = "kernel",.offset = SZ_1M,.size = SZ_1M * 3,3 = .name = "root"

7、,.offset = SZ_4M,.size = SZ_4M * 5,4 = .name = "user",.offset = SZ_4M * 6,.size = SZ_4M * 10,;注意:请不要画蛇添足地在进行自定义nand flash分区时仍然按照以前内核的移植步骤,在devs.c中自己添加分区信息,不然系统启动时会有出错信息:kobject_add failed for s3c2410-nand with -EEXIST, don't try to register things with the same name in the same directo

8、ry.<c00290a8> (dump_stack+0x0/0x14) from <c0110a9c> (kobject_shadow_add+0x160/0x1a8)<c011093c> (kobject_shadow_add+0x0/0x1a8) from <c0110af8> (kobject_add+0x14/0x18)<c0110ae4> (kobject_add+0x0/0x18) from <c015117c> (device_add+0xa0/0x568)<c01510dc> (device_a

9、dd+0x0/0x568) from <c0155180> (platform_device_add+0x100/0x150)<c0155080> (platform_device_add+0x0/0x150) from <c01551f0> (platform_device_register+0x20/0x24) r7:c0022a10 r6:c0020a1c r5:00000000 r4:c02cab30<c01551d0> (platform_device_register+0x0/0x24) from <c01553f8> (

10、platform_add_devices+0x24/0x6c) r4:00000000<c01553d4> (platform_add_devices+0x0/0x6c) from <c0011df4> (smdk_machine_init+0x84/0x98) r8:c03b8000 r7:00000000 r6:c0020a1c r5:00000000 r4:c0021404<c0011d70> (smdk_machine_init+0x0/0x98) from <c0011178> (smdk2410_init+0x1c/0x24)<

11、c001115c> (smdk2410_init+0x0/0x24) from <c000f0bc> (customize_machine+0x20/0x2c)<c000f09c> (customize_machine+0x0/0x2c) from <c0008914> (kernel_init+0xb8/0x284)<c000885c> (kernel_init+0x0/0x284) from <c003d688> (do_exit+0x0/0x76c)我一开始就犯了这个毛病。具体情况请参阅:四、 禁止nand flash的E

12、CC校验修改文件drivers/mtd/nand/s3c2410.c文件,查找函数s3c2410_nand_init_chip(),在函数的最后一行,添加chip->ecc.mode=NAND_ECC_NONE;五、增加yaffs2文件系统的支持 1、下载Yaffs2到/arm2410s目录下下载地址:http:/www.aleph1.co.uk/cgi-bin/viewcvs.cgi/2、解压Yaffs2并将其加入Linux内核(打补丁的方式)lingdubuntu:/arm2410s$ tar xzvf yaffs2.tar.gz lingdubuntu:/arm2410s$ cd

13、yaffs2lingdubuntu:/arm2410s/yaffs2$ ./patch-ker.sh c /arm2410s/linux-/六、博创2410S所配网卡AX88796(NE2000兼容网卡)驱动的移植。1、修改arch/arm/Kconfig文件,增加ISA总线支持,使其在make menuconfig 时出现NE2000的网卡配置选项。config ARCH_S3C2410bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"select GENERIC_GPIO

14、select ISA #lingdhelpSamsung S3C2410X CPU based systems, such as the Simtec ElectronicsBAST (<http:/www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 orthe Samsung SMDK2410 development board (and derivatives).2、修改include/asm-arm/arch-s3c2410/map.h文件。加入AX88796的地址映射。/*lingd*/ #define S3C2410_

15、VA_ISA_NET S3C2410_ADDR(0x02100000)#define S3C2410_PA_ISA_NET _phys_to_pfn(0x10000000)#define S3C2410_SZ_ISA_NET SZ_1M/*lingd*/ 说明: a、根据网上的资料,“#define S3C2410_VA_ISA_NET S3C2410_ADDR(0x02100000)”的地址可以自己修改,只要不和别的虚拟地址冲突就行。我有试过将起改成“#define S3C2410_VA_ISA_NET (0xd1000000)”,也就是博创的2.4.18的定义,也可以正常启动。 b、“#d

16、efine S3C2410_PA_ISA_NET _phys_to_pfn(0x10000000)”这句困扰了我很久。一开始我的定义是“#define S3C2410_PA_ISA_NET (0x10000000)”,所以启动后系统就死在了网卡的初始化上,出现“Unable to handle kernel paging request at virtual address ”的错误。后来我上网查找资料,才知道:原来实地址与虚地址的映射结构 smdk2410_iodesc 里有所变化。第二个参数从原来的 unsigned long physical 变为 unsigned long pfn (

17、Page Frame Number 页帧号)。而从 smdk2410_iodesc 传入的S3C2410_PA_ISA_NET 仍然是一个 physical 值,因此出现以上的错误。只要在物理地址前加上“_phys_to_pfn”就可以解决这个问题。较详细的讲解请看我的参考资料3、修改arch/arm/mach-s3c2410/mach-smdk2410.c文件。在smdk2410_iodesc 中加入AX88796的地址信息。static struct map_desc smdk2410_iodesc _initdata = /* nothing here yet */*lingd*/ .v

18、irtual = S3C2410_VA_ISA_NET, .pfn = S3C2410_PA_ISA_NET, .length = S3C2410_SZ_ISA_NET, .type = MT_DEVICE, /*lingd*/; 4、修改网卡驱动的主要文件drivers/net/ne.c(1)、添加头文件和定义#include <asm/system.h>#include <asm/io.h>/*lingd*/#include <linux/irq.h>#include <asm/arch-s3c2410/map.h>#include <

19、asm/arch-s3c2410/regs-mem.h>#include <asm/arch-s3c2410/irqs.h>#include <asm/arch-s3c2410/hardware.h>#include <asm/arch-s3c2410/regs-gpio.h>#define AX88796_BASE (vAX88796_BASE+0x200)#define AX88796_IRQ IRQ_EINT2#define pAX88796_BASE S3C2410_PA_ISA_NET#define vAX88796_BASE S3C2410

20、_VA_ISA_NET#define EXTINT_OFF (IRQ_EINT4 - 4)/*lingd*/. 在static struct const char *name8, *name16; unsigned char SAprefix4;bad_clone_list _initdata 中增加AX88796 的MAC地址前三位(不一定需要):"AX88796", "NE2000-compatible", 0x08, 0x08, 0x08, /lingd (2)、确保定义总线宽度为16位。 将#if defined(CONFIG_PLAT_MAPP

21、I)# define DCR_VAL 0x4b#elif defined(CONFIG_PLAT_OAKS32R) | defined(CONFIG_TOSHIBA_RBTX4927) | defined(CONFIG_TOSHIBA_RBTX4938)# define DCR_VAL 0x48 /* 8-bit mode */#else# define DCR_VAL 0x49#endif修改为#if 0#if defined(CONFIG_PLAT_MAPPI)# define DCR_VAL 0x4b#elif defined(CONFIG_PLAT_OAKS32R) | defined

22、(CONFIG_TOSHIBA_RBTX4927) | defined(CONFIG_TOSHIBA_RBTX4938)# define DCR_VAL 0x48 /* 8-bit mode */#else#endif#endif# define DCR_VAL 0x49 (3)、在do_ne_probe函数中增加配置总线参数、基地址和中断的语句(其参数参考 刘淼 的书)static int _init do_ne_probe(struct net_device *dev)unsigned long base_addr = dev->base_addr;#ifdef NEEDS_PORT

23、LISTint orig_irq = dev->irq;#endif/*lingd*/static int once=0;if (once) return -ENXIO;unsigned int value;value = _raw_readl(S3C2410_BWSCON);value &= (S3C2410_BWSCON_WS2|S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_32);value |= (S3C2410_BWSCON_ST2|S3C2410_BWSCON_DW2_16);_raw_writel(value, S3C2410_BWSC

24、ON);value=0;value = (S3C2410_BANKCON_Tacs4|S3C2410_BANKCON_Tcos4|S3C2410_BANKCON_Tacc14|S3C2410_BANKCON_Tcoh4|S3C2410_BANKCON_Tcah4|S3C2410_BANKCON_Tacp6|S3C2410_BANKCON_PMCnorm);_raw_writel(value,S3C2410_BANKCON2);set_irq_type(AX88796_IRQ,IRQ_TYPE_LEVEL_LOW );s3c2410_gpio_cfgpin(S3C2410_GPF2, S3C24

25、10_GPF2_EINT2);s3c2410_gpio_pullup(S3C2410_GPF2, 0);if(base_addr=0)dev->base_addr = base_addr = AX88796_BASE ;dev->irq = AX88796_IRQ;once+;/*lingd*/ SET_MODULE_OWNER(dev); /* First check any supplied i/o locations. User knows best. <cough> */ if (base_addr > 0x1ff) /* Check a single s

26、pecified location. */ return ne_probe1(dev, base_addr); else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO;.(4)、修改ne_probe1函数增加自定义的网卡MAC地址(这个地址可以自行修改,但是MAC也有一定的规则,最重要的是千万不要把它配置为广播或组播地址,请参考网络的相关书籍):static int _init ne_probe1(struct net_device *dev, unsigned long ioaddr) int i;unsign

27、ed char ne_defethaddr=0x08,0x08,0x08,0x08,0x12,0x27,0; /lingdunsigned char SA_prom32;int wordlength = 2;. 增加网卡MAC地址的配置语句,屏蔽通过EEPROM配置网卡的语句.struct unsigned char value, offset; program_seq =E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD, /* Select page 0*/0x48, EN0_DCFG, /* Set byte-wide (0x48) access.

28、 */0x00, EN0_RCNTLO, /* Clear the count regs. */0x00, EN0_RCNTHI,0x00, EN0_IMR, /* Mask completion irq. */0xFF, EN0_ISR,E8390_RXOFF, EN0_RXCR, /* 0x20 Set to monitor */E8390_TXOFF, EN0_TXCR, /* 0x02 and loopback mode. */32, EN0_RCNTLO,0x00, EN0_RCNTHI,0x00, EN0_RSARLO, /* DMA starting at 0x0000. */0

29、x00, EN0_RSARHI,E8390_RREAD+E8390_START, E8390_CMD,;for (i = 0; i < sizeof(program_seq)/sizeof(program_seq0); i+)outb_p(program_seqi.value, ioaddr + program_seqi.offset);/*lingd*/unsigned char *ep;ep = (unsigned char * ) &ne_defethaddr0;ne_defethaddr5+;for(i=0;i<6;i+) SA_promi = epi;SA_pro

30、m14 = SA_prom15=0x57;wordlength =2;/*lingd*/#if 0 /lingdfor(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) SA_promi = inb(ioaddr + NE_DATAPORT);SA_promi+1 = inb(ioaddr + NE_DATAPORT);if (SA_promi != SA_promi+1)wordlength = 1;#endif /lingd if (wordlength = 2) #if 0 /lingdfor (i = 0; i < 16; i+)SA_pro

31、mi = SA_promi+i;/* We must set the 8390 for word mode. */outb_p(DCR_VAL, ioaddr + EN0_DCFG);start_page = NESM_START_PG;/* Realtek RTL8019AS datasheet says that the PSTOP register* shouldn't exceed 0x60 in 8-bit mode.* This chip can be identified by reading the signature from* the remote byte cou

32、nt registers (otherwise write-only).*/if (DCR_VAL & 0x01) = 0 && /* 8-bit mode */ inb(ioaddr + EN0_RCNTLO) = 0x50 && inb(ioaddr + EN0_RCNTHI) = 0x70)stop_page = 0x60;elsestop_page = NESM_STOP_PG;#endif /lingd/*lingd*/outb_p(0x49, ioaddr + EN0_DCFG);start_page = NESM_START_PG;stop

33、_page = NESM_STOP_PG;/*lingd*/ else start_page = NE1SM_START_PG;stop_page = NE1SM_STOP_PG;.屏蔽自定检测中断号的语句(参考 刘淼 的书):.#if 0 /lingdif (dev->irq < 2)unsigned long cookie = probe_irq_on();outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */outb_p(0x00, ioaddr + EN0_RCNTLO);outb_p(0x00, ioaddr

34、 + EN0_RCNTHI);outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it. */mdelay(10); /* wait 10ms for interrupt to propagate */outb_p(0x00, ioaddr + EN0_IMR); /* Mask it again. */dev->irq = probe_irq_off(cookie);if (ei_debug > 2)printk(" autoirq is %dn", dev->irq); else if (dev-&g

35、t;irq = 2)/* Fixup for users that don't know that IRQ 2 is really IRQ 9,or don't know which one to set. */dev->irq = 9;#endif /lingdif (! dev->irq) printk(" failed to detect IRQ line.n");ret = -EAGAIN;goto err_out; 七、配置内核1、载入s3c2410的默认配置文件,以简化配置过程lingdubuntu:/arm2410s/linux-2

36、.6.24.7$ cp arch/arm/configs/s3c2410_defconfig .configlingdubuntu:/arm2410s/linux-$ make menuconfig2、手动配置内核,在s3c2410_defconfig基础上,增加以下配置选项:General setup -> * Configure standard kernel features (for small systems) -> 选上这项,否则文件系统中的一些选项不会出现* Enable full-sized data structures for core * En

37、able futex support * Enable eventpoll support * Enable signalfd() system call * Enable eventfd() system call * Use full shmem filesystem* Enable loadable module support ->* Automatic kernel module loading System Type ->* S3C2410 DMA supportBoot options ->Default kernel command string:noinit

38、rd root=31:03 init=/linuxrc console=ttySAC0,115200 mem=64M注意:udev需要内核提供sysfs和tmpfs支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间,也就是说,在上电之前系统上是没有足够的设备文件可用的,我们需要一些技巧让kernel先引导起来。由于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock 是不存在的,我们无法让kernel找到rootfs,kernel只好停在那里惊慌(panic)。 这个问题

39、我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号 从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel的cmd line参数,使root=31:03,就可以让kernel在udevd未起来之前成功的找到rootfs。 Networking ->Networking options -> <*> Packet socket * Packet socket: mmapped IOFloating point emulation

40、->* NWFPE math emulation Device Drivers -><*> Memory Technology Devices (MTD ->* MTD partitioning support* Command line partition table parsingRAM/ROM/Flash chip drivers -><*> Detect flash chips by Common Flash Interface (CFI) probe<*> Detect nonCFI AMD/JEDECcompatible

41、flash chips<*> Support for Intel/Sharp flash chips<*> Support for AMD/Fujitsu flash chips<*> Support for ROM chips in bus mapping<*> NAND Device Support -><*> NAND Flash support for S3C2410/S3C2440 SoCNetwork device support ->* Ethernet (10 or 100Mbit) ->“N”掉< > DM9000 support和< > Generic Media Independent Interface device support以下一定要选上,是AX88796的驱动* Other ISA cards <*> NE2000/NE1000 supportCharacter devices ->* Nonstandard serial por

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论