宿主机: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. hdu 5461 Largest Point

    Thinking about it: 对于式子 a * ti * ti + b * tj,可以看作时有两部分构成 a * ti * ti 和 b * tj,如果整个式子要最大,则要求这两部分都要尽量大 ...

  2. iOS开发中,应用内直接跳转到Appstore

    iOS开发中,应用内直接跳转到Appstore 1.进入appstore中指定的应用NSString *str = [NSString stringWithFormat:                ...

  3. The Building Blocks-Components of EA part 1- Information and Strategy

    1. Zachman Framework Presented as matrix of Rows and Columns representing domain of interest and lev ...

  4. VS C++工程类成员初始化检测脚本

    最近项目中出现由类成员未初始化而进行读写而造成的问题,于是想将项目中所有的为初始化的地方找出来,优化一下代码,维护了这么多年的程序已有百万余行且VS2015还尚未支持检查类成员初始化的方法.,于是想写 ...

  5. NSFileManager的应用

    单例,是在 一个文件中只创建一次就能够全部一起共享,多创建的地址是相同的 NSFileManager *manager=[NSFileManager defaultManager]; 是一个单例   ...

  6. Node.js、Ionic、Cordova、AngualrJS安装

    1.安装node.js: 从node.js官网下载node.js安装包,node.js下载地址:https://nodejs.org/en/download/,选择对应系统的安装下载后进行安装.(注: ...

  7. 移动端开发(四):swiper.js

    swiper.js中文网:http://www.swiper.com.cn/ 文档结构 swiper.jquery.js    是需要引用jquery.js 或者 zepto.js 时,只需直接引用该 ...

  8. nginx+uwsgi部署python web(web.py)

    1.nginx: nginx 是一个 http 服务器,与 apache.lighttpd.Microsoft IIS 等属于同类产品. 2.uWSGI: uWSGI 是一个快速的.纯C语言开发的.自 ...

  9. PCIE卡槽还能这样用!

    前几天去电脑城装了台i5的主机,当时就发现主板上只有2个PCIex2的槽.但奇怪的是2个还长的不一样,一个屁股后面是开口的:) 问装机的小伙子,他也不懂,而且就这电脑操作水平都跟哥差远了,让他给我硬盘 ...

  10. verilog中读取文件中的字符串_modelsim高级仿真

    今天给个程序大家玩玩.因为今天遇到一个问题,就是要向UART发送指令,指令非常多,都是字符串.一直copy 函数 UART ("COMM_1");  UART ("COM ...