宿主机: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

linux-2.6.33移植到FL2440的更多相关文章

  1. 基于s5pv210嵌入式linux系统sqlite3数据库移植

    基于s5pv210嵌入式linux系统sqlite3数据库移植 1.下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2.解压 tar xvf ...

  2. Linux Charger IC 驱动移植总结

    Linux Charger IC 驱动移植总结 文章目录 Linux Charger IC 驱动移植总结 1 设备树的基本知识 设备树的概念 设备树的基本结构 compatible属性 举个栗子 2 ...

  3. linux-3.0内核移植到fl2440开发板(以MINI2440为模板)

    我们的fl2440开发板使用的是s3c2440的芯片,与MINI2440十分相似,因此需要改动的地方不多,移植也比较容易. 1.[weishusheng@localhost kernel]$ sudo ...

  4. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  5. linux enc28j60网卡驱动移植(硬件spi和模拟spi)

    本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是 ...

  6. Qt4.8.6 Embedded Linux 的编译与移植

    最近买了个飞凌ok6410 的开发板,于是在其中搭建qt4.8.6运行环境.费了两三天时间,主要还是对Linux系统的生疏,在一些问题上徘徊很久,在这里做一些过程笔记.烧写ARM-Linux系统,根据 ...

  7. linux内核链表的移植与使用

    一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...

  8. [Linux][Madplay播放器移植mini2440(ARM9)]

    Madplay移植到mini2440全过程详解 madplay交叉编译 交叉编译器:arm-linux-gcc 3.4.1PC环境:RedHat-6 注意:最好在root权限下执行以下移植,否则在ma ...

  9. Linux之开源软件移植

    移植环境 Utuntu 15.04 1.mplayer移植 版本:mplayer-export-snapshot.tar.bz2 /mplayer-export-2015-11-26 Linux PC ...

随机推荐

  1. Codeblock解决注释乱码问题及在ubuntu中程序运行时乱码问题。

    (1)修改源文件保存编码在:settings->Editor->gernal settings>other settings 看到左边的Encoding group Box,改为WI ...

  2. 取得phpcms网站下所有栏目的内容链接

    今天做了一个小功能,就是取得公司网站的所有文章的内容地址,公司网站是用phpcms 做的,感觉还蛮简单的,记录下: <?php $conf['DB_USER'] = 'user'; $conf[ ...

  3. Android系统JNI的实现方式

     Android系统JNI的实现方式 All rights reserved JNI(Java Native Interface)定义了一种Java代码调用C或者C++代码等其它代码的方式. 在A ...

  4. JavaMail收发邮件的一般流程与主要方法

    1.Properties属性类 Properties p = new Properties(); p.put(key, value); key -| mail.smtp.host -| mail.sm ...

  5. struts的MVC详细实现

    struts中核心类:ActionServlet,其中最主要的操作是RequestProcessor类中的process方法. struts实现mvc的详解图如下: 1.Tomcat一启动,根据web ...

  6. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

  7. Vistual Studio 2010 调试无法进断点

    系统是2003出现的问题 win8就没事 打sp1 补丁就行

  8. 关于switch的思考和总结

    1.通常每个case的末尾都应该加个break; 否则会default分支也会被执行 var score = 40;switch (score){case 50:console.log('50');/ ...

  9. NHibernate composite-id联合主键配置

    NHibernate的联合主键配置比较复杂,初次配置可能需要花些时间,但只要我们理解了,掌握一定的步骤还是很容易的. 1.设计数据结构 Users:用户表 名称 Users 说明 用户表 序号 字段名 ...

  10. HDU 1267 下沙的沙子有几粒?

    题解:利用卡特兰数的几何意义,题目就可以转化为一个棋盘格,可以向下走或是向右走,但是不可以逾越对角线,就可以了. #include <cstdio> #include <iostre ...