• linux-2.6.33移植到FL2440


    宿主机:ubuntu10.04

    目标机:fl2440
    交叉编译器:arm-linux-gcc-3.4.1
    交叉编译器路径:/usr/local/arm/3.4.1
    要移植的内核版本:linux-2.6.33.19

    <1>移植yaffs2驱动

    yaffs下载地址:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi

    tar zxvf yaffs2.tar.gz

    cd yaffs2

    ./patch-ker.sh c /linux-2.6.33.19

    <2>修改机器码

    1. s3c2410 ARCH_S3C2410 S3C2410 193    删掉
    1. s3c2440 ARCH_S3C2440 S3C2440 362

    修改为

    1. s3c2440 ARCH_S3C2440 S3C2440 193

    <3> 指定编译器

    ARCH                ?= arm
    CROSS_COMPILE        ?= arm-linux-

    <4>增加devfs文件器支持

    找到 menu "Pseudo filesystems"

    大概在105行

    config DEVFS_FS
             bool "/dev file system support (OBSOLETE)"
             default y 
    config DEVFS_MOUNT
    bool "Automatically mount at boot"
    default y
    depends on DEVFS_FS

    <5>修改晶振频率

    arch/arm/mach-s3c2440/mach-smdk2440.c

    s3c24xx_init_clocks(12000000);

    <6>修改MTD分区

    arch/arm/plat-s3c24xx/common-smdk.c

    static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
                .name        = "boot",
                .size        = 0x00020000,
                .offset = 0
        },
        [1] = {
                .name        = "bootParam",
                .size        = 0x00060000,
                .offset = 0x00020000,
        },
        [2] = {
                .name        = "Kernel",
                .size        = 0x00300000,
                .offset = 0x00500000,
        },
        [3] = {
                .name        = "fs_yaffs",
                .size        = 0x03c00000,
                .offset = 0x00800000,
            },       
        [4] = {
                .name        = "eboot",
                .size        = 0x00080000,
                .offset = 0x04400000,
        },
        [5] = {
                .name        = "WINCE",
                .size        = 0x03b80000,
                .offset = 0x04480000,
        }
    };

    <7>关闭ECC校验

    drivers/mtd/nand/s3c2410.c

      chip->ecc.mode = NAND_ECC_NONE;

    <8>修改nandflash驱动,支持K9F1G08的nandflash
    修改drivers/mtd/nand下面的nand_bbt.c文件:

    static struct nand_bbt_descr largepage_memorybased = {
            .options = 0,
            .offs = 0,
            .len = 1,           // 原数值为2,支持2K每页的flash修改为1。K9F1G08,K9F2G08是2k每页的flash
            .pattern = scan_ff_pattern
    };
    static struct nand_bbt_descr largepage_flashbased = {
            .options = NAND_BBT_SCAN2NDPAGE,
            .offs = 0,
            .len = 1,           //原数值为2,支持2K每页的flash修改为1。K9F1G08,K9F2G08是2k每页的flash
            .pattern = scan_ff_pattern
    };

    <9>开始配置内核

    make s3c2410_defconfig


    去掉S3C2400 Machines、S3C2410 Machines、S3C2412 Machines、S3C2442 Machines的所有选项,否则会报错。如果现在编译内核,下载到开发板中,内核就可以正常启动了。呵呵,有了雏形,咱们继续移植设备驱动

    <10>支持RTC

    arch/arm/mach-s3c2440/mach-smdk2440.c

    static struct platform_device *smdk2440_devices[] __initdata = {
            &s3c_device_usb,
            &s3c_device_lcd,
            &s3c_device_wdt,
            &s3c_device_i2c0,
            &s3c_device_iis,
            &s3c_device_rtc,
    };

    <11>移植UDA1341

    arch/arm/mach-s3c2440/mach-smdk2440.c

    添加头文件

    #include <sound/s3c24xx_uda134x.h>
    #include <mach/gpio-fns.h>

    添加代码

    static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
            .l3_clk = S3C2410_GPB(4),
            .l3_data = S3C2410_GPB(3),
            .l3_mode = S3C2410_GPB(2),
            .model = UDA134X_UDA1341,
    };

    static struct platform_device s3c24xx_uda134x = {
            .name = "s3c24xx_uda134x",
            .dev = {
                    .platform_data    = &s3c24xx_uda134x_data,
            }
    };

    把设备添加到平台当中

    static struct platform_device *smdk2440_devices[] __initdata = {
            &s3c_device_usb,
            &s3c_device_lcd,
            &s3c_device_wdt,
            &s3c_device_i2c0,
            &s3c_device_iis,
            &s3c_device_rtc,
            &s3c24xx_uda134x,
    };

    <12>移植DM9000

    修改 drivers/net/dm9000.c 文件

    #include <mach/regs-gpio.h>
    #include <mach/irqs.h>
    #include <mach/hardware.h>

    在dm9000_probe 函数开始增加:

    unsigned char ne_def_eth_mac_addr[]={0x00,0x12,0x34,0x56,0x80,0x49};
        static void *bwscon;
        static void *gpfcon;
        static void *extint0;
        static void *intmsk;
        #define BWSCON           (0x48000000)
        #define GPFCON           (0x56000050)
        #define EXTINT0           (0x56000088)
        #define INTMSK           (0x4A000008)
            bwscon=ioremap_nocache(BWSCON,0x0000004);
            gpfcon=ioremap_nocache(GPFCON,0x0000004);
            extint0=ioremap_nocache(EXTINT0,0x0000004);
            intmsk=ioremap_nocache(INTMSK,0x0000004);
            writel(readl(bwscon)|0xc0000,bwscon);
            writel( (readl(gpfcon) & ~(0x3 << 14)) | (0x2 << 14), gpfcon);
            writel( readl(gpfcon) | (0x1 << 7), gpfcon); // Disable pull-up
            writel( (readl(extint0) & ~(0xf << 28)) | (0x4 << 28), extint0); //rising edge
            writel( (readl(intmsk))  & ~0x80, intmsk);  

    在这个函数的最后需要修改:

    if (!is_valid_ether_addr(ndev->dev_addr)) {
                    mac_src = "chip";
                    for (i = 0; i < 6; i++)
                            //ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
                            ndev->dev_addr[i] = ne_def_eth_mac_addr[i];
            }

    2. 修改arch/arm/mach-s3c2440/mach-smdk2440.c,添加设备

    static struct platform_device *smdk2440_devices[] __initdata = {
            &s3c_device_usb,
            &s3c_device_lcd,
            &s3c_device_wdt,
            &s3c_device_i2c0,
            &s3c_device_iis,

             &s3c_device_rtc,
            &s3c24xx_uda134x,
            &s3c_device_dm9000,
    };

    3. 修改 arch/arm/plat-s3c24xx/devs.c

    #include <linux/dm9000.h>

    static struct resource s3c_dm9000_resource[] = {
            [0] = {
            .start = S3C24XX_PA_DM9000,
            .end   = S3C24XX_PA_DM9000+ 0x3,
            .flags = IORESOURCE_MEM
            },
            [1]={
            .start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2
            .end = S3C24XX_PA_DM9000 + 0x4 + 0x7c,
            .flags = IORESOURCE_MEM
            },
            [2] = {
            .start = IRQ_EINT7,
            .end   = IRQ_EINT7,
            .flags = IORESOURCE_IRQ
            },
            };

            static struct dm9000_plat_data s3c_device_dm9000_platdata = {
            .flags= DM9000_PLATF_16BITONLY,
            };

            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_device_dm9000_platdata,
              }
    };
    EXPORT_SYMBOL(s3c_device_dm9000);

    4. 修改 arch/arm/plat-s3c/include/plat/devs.h 45行附近,添加

    extern struct platform_device s3c_device_dm9000;

    5.修改arch/arm/mach-s3c2410/include/mach/map.h 文件

    #define   S3C24XX_PA_DM9000 0x20000300
    #define   S3C24XX_VA_DM9000 0xE0000000

    一. 修改arch/arm/plat-s3c24xx/devs.c
    找到 ------------------------------>224行左右
    将其下面的代码改为:
    static struct resource s3c_ts_resource[] = {
    [0] = {
    .start = S3C24XX_PA_ADC,
    .end = S3C24XX_PA_ADC + S3C24XX_SZ_ADC - 1,
    .flags = IORESOURCE_MEM,
    },
    [1] = {
    .start = IRQ_TC,
    .end = IRQ_TC,
    .flags = IORESOURCE_IRQ,
    },
    };
    struct platform_device s3c_device_ts = {
    .name = "s3c2410-ts",
    .id = -1,
    .dev.parent = &s3c_device_adc.dev,
    .num_resources = ARRAY_SIZE(s3c_ts_resource),
    .resource = s3c_ts_resource,
    };
    EXPORT_SYMBOL(s3c_device_ts);
    static struct s3c2410_ts_mach_info s3c2410ts_info;
    void __init s3c24xx_ts_set_platdata(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
    {
    memcpy(&s3c2410ts_info, hard_s3c2410ts_info, sizeof(struct s3c2410_ts_mach_info));
    s3c_device_ts.dev.platform_data = &s3c2410ts_info;
    }
    EXPORT_SYMBOL(s3c24xx_ts_set_platdata);
    二. 修改arch/arm/mach-s3c2440/mach-smdk2440.c文件。
    添加头文件#include <mach/ts.h>
    并在static struct platform_device *smdk2440_devices[] __initdata 结构体数组内添加
    &s3c_device_adc,(触摸屏需要ADC的支持)
    &s3c_device_ts, //最好将adc添加到ts前面,否则触摸屏初始化时可能会出错//
    并在上面结构体后面添加:
    static struct s3c2410_ts_mach_info smdk2410_ts_cfg __initdata = {
    .delay = 10000,
    .presc = 49,
    .oversampling_shift = 2,
    };
    最后在static void __init smdk2440_machine_init(void)函数中增加下列代码:
    s3c24xx_ts_set_platdata(&smdk2410_ts_cfg);
    三. 重新配置内核:
    make menuconfig
    在配置菜单中添加如下项:
    Device Drivers --->
    <*>Input device support --->
    <*>Touchscreens --->
    <*> Samsung S3C2410 touchscreen input driver
    还有在编译的时候记得把这项也选上:
    Device Drivers --->
    <*>Input device support --->
    <*> Event interface
    四. 重新编译内核
    make zImage
    把生成怕镜像文件烧到板上运行,结果如下截图:
    说明触摸屏驱动已加载进内核随系统启动起来了,但是在启动最后出现
    在开发板终端执行 ls /dev 看见里面有个event0,这个就是触摸屏的设备文件。但是内核加载触摸屏用的设备名是/dev/ts0. 因此可以用以下方法解决:
    mknod /dev/ts0 c 13 64(c代表字符型设备 13代表主设备号 64代表从设备号------可以查看内核源码,打开Documentation/devices.txt文件即可查看到具体的主从设备号)
    另外的一种方法是在/dev/event0 和/dev/ts0之间做一个链接:
    执行ln –s /dev/event0 /dev/ts0
    然后再终端执行 cat /dev/ts0 然后触摸触摸屏 看终端是否有打印信息(我的是一些乱码的打印信息)。但是要让触摸屏能正常使用,还需要移植一个支持触摸屏校准的tslib.
    接下来的工作就是移植tslib.

    转自:

    http://bbs.witech.com.cn/thread-4872-1-1.html

    http://bbs.witech.com.cn/thread-468-2-1.html

  • 相关阅读:
    (三)mybatis 的使用(入门)
    (二)mybatis框架原理(图解)
    (一)使用 mybatis 的缘由
    (八)Spring 事务管理
    (七)Spring 配置 c3p0 连接池
    (六)Spring 中的 JdbcTemplate
    熔断监控集群(Turbine)
    熔断监控面板(Hystrix Dashboard)
    容错机制和熔断(Hystrix)
    服务消费和负载(Feign)
  • 原文地址:https://www.cnblogs.com/wang-le/p/3278954.html
Copyright © 2020-2023  润新知