linux-4.3.6 移植到utu2440

1.机器id 匹配。uboot 机器id在 include/asm-arm/mach-types.h 中定义。linxu-3.4.6 的arch/arm/tools/mach-types 中添加utu2440                 ARCH_UTU2440            UTU2440                 5244  和uboot中id相比配。 好像还要改什么东西忘了。

将arch/arm/mach-s3c24xx/mach-smdk2440.c拷贝成mach-utu2440.c,

将MACHINE_START(SMDK2440, "SMDK2440")改为

MACHINE_START(UTU2440, "UTU2440")
 /* Maintainer: Ben Dooks */
 .atag_offset    = 0x100,

         .init_irq       = s3c24xx_init_irq,
         .map_io         = smdk2440_map_io,
         .init_machine   = smdk2440_machine_init,
         .timer          = &s3c24xx_timer,
         .restart        = s3c244x_restart,
         MACHINE_END
2.在调试内核时会打印不出数据,printk函数是在控制台初始化后才能把存在缓存区的数据打出来,可以用printascii实现打印,在用之前 需要extern void printascii(const char*);申明一下才可以使用,在这里我把它内嵌到printk函数中了,该函数在kernel/printk.c中,代码如下:


 asmlinkage int printk(const char *fmt, ...)
 748 {
 749         va_list args;
 750         int r;
 751 #ifdef CONFIG_DEBUG_LL
 752         extern void printascii(const char*);
 753         char buff[512];
 754 #endif
 755 #ifdef CONFIG_KGDB_KDB
 756         if (unlikely(kdb_trap_printk)) {
 757                 va_start(args, fmt);
 758                 r = vkdb_printf(fmt, args);
 759                 va_end(args);
 760                 return r;
 761         }
 762 #endif
 763         va_start(args, fmt);
 764         r = vprintk(fmt, args);
 765 #ifdef CONFIG_DEBUG_LL
 766         vsprintf(buff,fmt,args);
 767 #endif
 768         va_end(args);
 769 #ifdef CONFIG_DEBUG_LL
 770         printascii(buff);
 771 #endif
 772         return r;
 773 }
分配给printascii的缓冲区尽量大点,避免缓冲区溢出,缓冲区溢出会打印停顿在溢出的打印那边,通常打印的数据比较大。

3.汇编语言结束后进入asmlinkage void __init start_kernel(void) 函数,该函数在init/main.c当中,内核c语言的入口函数,实现初始化内核

4。修改时钟在 static void __init smdk2440_map_io(void)添加:

代码如下:

 static void __init smdk2440_map_io(void)
220 {
221         s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
222 #ifdef CONFIG_S3C2440_XTAL_12000000
223         s3c24xx_init_clocks(12000000);
224 #else
225         s3c24xx_init_clocks(16934400);
226 #endif
227
228         s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
229 }
我用的时钟是12000000,内核默认给的是16934400,添加一个宏变量修改就ok了

5.nand移植
系统在arch/arm/plat-samsung/devs.c 下定义了s3c2410-nand平台设备

#ifdef CONFIG_S3C_DEV_NAND
 955 static struct resource s3c_nand_resource[] = {
 956         [0] = DEFINE_RES_MEM(S3C_PA_NAND, SZ_1M),
 957 };
 958
 959 struct platform_device s3c_device_nand = {
 960         .name           = "s3c2410-nand",
 961         .id             = -1,
 962         .num_resources  = ARRAY_SIZE(s3c_nand_resource),
 963         .resource       = s3c_nand_resource,
 964 };
只需打开CONFIG_S3C_DEV_NAND宏即可,

平台私有数据配置:

/* nand flash:add by pan*/
 87 static int chip0_map[] = { 0 };
 88 static struct mtd_partition bit_default_nand_part[] __initdata= {
 89         [0] = {
 90                 .name = "bootloader",
 91                 .size = 0x00060000,
 92                 .offset = 0x00000000,
 93         },
 94         [1] = {
 95                 .name = "kernel",
 96                 .size = 0x00200000,
 97                 .offset = 0x00060000,
 98         },
 99         [2] = {
100                 .name = "root",
101                 .size = 0x03d9c000,
102                 .offset = 0x00260000,
103         },
104
105 };
/* the bit has 1 selectable slots for nand-flash, the three
108  * on-board chip areas, as well as the external SmartMedia
109  * slot.
110  *
111  * Note, there is no current hot-plug support for the SmartMedia
112  * socket.
113  */
114
115 static struct s3c2410_nand_set bit_nand_sets[] __initdata = {
116         [0] = {
117                 .name           = "chip0",
118                 .nr_chips       = 1,
119                 .nr_map         = chip0_map,
120                 .nr_partitions  = ARRAY_SIZE(bit_default_nand_part),
121                 .partitions     = bit_default_nand_part,
122         },
123 };
124
125
126 static struct s3c2410_platform_nand bit_nand_info = {
127         .tacls          = 0,
128         .twrph0         = 30,
129         .twrph1         = 0,
130         .nr_sets        = ARRAY_SIZE(bit_nand_sets),
131         .sets           = bit_nand_sets,
132 };

smdk2440_machine_init(void)中添加

static void __init  s3c_nand_set_platdata(&bit_nand_info);


6.cs8900网卡移植

arch/arm/plat-samsung/include/plat/map-s3c.h中定义

 #define S3C24XX_VA_CS8900 0xE0000000
 36 #define S3C2410_PA_CS8900 (0x19000000)
 37 #define S3C24XX_SZ_CS8900 SZ_1M
 38 #define S3C24XX_PA_CS8900 S3C2410_PA_CS8900

在static struct map_desc smdk2440_iodesc[] __initdata = {  } 结构中添加

, {
 80                 .virtual        = (u32)S3C24XX_VA_CS8900,
 81                         .pfn            = __phys_to_pfn(S3C24XX_PA_CS8900),
 82                         .length         = SZ_1M,
 83                         .type           = MT_DEVICE,
 84         }
在void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)函数中实现虚拟地址到物理地址的映射,修改drivers/net/ethernet/cirrus/cs89x0.c

文件,

添加在文件开头

#elif defined(CONFIG_ARCH_UTU2440)
 186 static unsigned int netcard_portlist [] __initdata = { S3C24XX_VA_CS8900 + DEFAULTIOBASE, 0 };
 187
 188 static unsigned int cs8900_irq_map[] = { IRQ_EINT9, 0, 0, 0 };

 struct net_device * __init cs89x0_probe(int unit)中修改:

在 io = dev->base_addr;
 338         irq = dev->irq;后添加

 #if CONFIG_ARCH_UTU2440
 340         __raw_writel((__raw_readl(S3C2410_GPGCON)&~(0x3<<2))|(0x2<<2),S3C2410_GPGCON);
 341         __raw_writel((__raw_readl(S3C2410_EXTINT1)&~(0x7<<4))|(0x4<<4),S3C2410_EXTINT1);
 342
 343 #endif
设置GPIO状态

 static int __init
 531 cs89x0_probe1(struct net_device *dev, unsigned long ioaddr, int modular)
中修改:

 reset_chip(dev);后面添加

 #ifdef CONFIG_ARCH_UTU2440
 633         dev->dev_addr[0] = 0x00;
 634         dev->dev_addr[1] = 0x11;
 635         dev->dev_addr[2] = 0x3e;
 636         dev->dev_addr[3] = 0x26;
 637         dev->dev_addr[4] = 0x0a;
 638         dev->dev_addr[5] = 0x5b;
 639 #endif

设置mac地址必须和uboot设置的mac地址相同

 static int
1232 net_open(struct net_device *dev)中修改:

在如下#if  #endif 中添加CONFIG_ARCH_UTU2440宏

 #if !defined(CONFIG_ARCH_UTU2440)&&!defined(CS89x0_NONISA_IRQ) && !defined(CONFIG_CS89x0_PLATFORM)
1269                 if (((1 << dev->irq) & lp->irq_map) == 0) {
1270                         printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
1271                                dev->name, dev->irq, lp->irq_map);
1272                         ret = -EAGAIN;
1273                         goto bad_out;
1274                 }
1275 #endif
在 if (!result) {
1357                 printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name);

前添加#if defined CONFIG_ARCH_UTU2440
1354         result=A_CNF_10B_T;
1355 #endif
这样网卡移植就ok了












你可能感兴趣的:(linux内核)