FL2440 Linux-3.0最小系统移植

来源:互联网 发布:Windows wifi 登录 编辑:程序博客网 时间:2024/06/03 18:24

来自:www.kansnow.com

一、源码修改

Linux 是一个源码开放的操作系统,无论是普通用户还是企业用户都可以编写自己的内核代码,再加上对标准内核的裁剪从而制作出适合自己的操作系
统。Linux操作系统有很多发行版本,如Redhat, CentOS, Ubuntu等等,但所有的这些Linux操作系统都是选择一个Linux内核稳定版本,外加不同的C基础
库和应用程序构建的一个操作系统。
嵌入式Linux系统开发其本质就是我们拿到源码并进行修改DIY(Do It Yourself)一个属于我们自己的操作系统,这个过程包括Booloader和Linux内核(裁
剪)移植、驱动模块编写、根文件系统制作、第三方应用程序移植等,这个工作叫做BSP(Board Support Packet,板级支持包)开发,这里面需要相应的硬
件协议、操作系统、以及C语言和数据结构等知识,难度较高。

/* 创建好目录后linux内核3.0下载 */[zhoupiaolong@localhost fl2440-dir]$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.0.tar.bz2[zhoupiaolong@localhost fl2440-dir]$ tar -xjf linux-3.0.tar.bz2
修改1:

SMDK2440上使用的是16MHz的晶振,而FL2440上使用的是12MHz的晶振,所以开发板相应代码要做修改

[zhoupiaolong@localhost linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.cstatic void __init smdk2440_map_io(void){s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));- s3c24xx_init_clocks(16934400);+ s3c24xx_init_clocks(12000000);s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));}
修改2:

我的u-boot给Linux内核传的machine ID值为1999,而Linux内核里smdk2440开发板对应的machine ID是362,所以我们要修改内核代码让
smdk2440的machine ID与u-boot里的保持一致,这里我们在源码中将两个machine ID值互换:

[zhoupiaolong@localhost linux-3.0]$ vim arch/arm/tools/mach-types-s3c2440 ARCH_S3C2440 S3C2440 362+s3c2440 ARCH_S3C2440 S3C2440 1999... ...-mini2440 MACH_MINI2440 MINI2440 1999+mini2440 MACH_MINI2440 MINI2440 362
修改3:

samsung的串口驱动设备名字默认叫ttySAC,而我们一般使用ttyS,所以将源码中的设备名改掉:

[zhoupiaolong@localhost linux-3.0]$ vim drivers/tty/serial/samsung.c-#define S3C24XX_SERIAL_NAME "ttySAC"+#define S3C24XX_SERIAL_NAME "ttyS"
修改4:

修改顶层Makefile的ARCH为arm, CROSS_COMPILE为我们自己相应的交叉编译器:

[zhoupiaolong@localhost linux-3.0]$ vim Makefile-ARCH ?= $(SUBARCH)-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)+ARCH ?= arm                        //arm后面不能有任何字符我之前就是应为这里多个空格导致运行后卡死。+CROSS_COMPILE ?= /opt/xtools/arm920t/bin/arm-linux- //这里改成大家自己的交叉编译器,注意arm-linux-后面应该紧跟回车,不能有其他任何字符
修改5

添加DM9000网卡设备支持.

[zhoupiaolong@localhost linux-3.0]$ vim arch/arm/mach-s3c2440/mach-smdk2440.cstatic struct platform_device *smdk2440_devices[] __initdata = {&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,+ &s3c_device_dm9000, /* 添加DM9000网卡的设备,告诉Linux内核现在有这个硬件连上来了 */};```

[zhoupiaolong@localhost linux-3.0]$ vim arch/arm/plat-s3c24xx/devs.c //在该C文件中定义结构体变量 s3c_device_dm9000
… … …
EXPORT_SYMBOL(s3c_device_iis);
+#ifdef CONFIG_DM9000 /* DM9000 network device support add by zhoupiaolong 2017.11.07*/
+#include

```[zhoupiaolong@localhost linux-3.0]$ vim arch/arm/plat-samsung/include/plat/devs.h //在该头文件中导出s3c_device_dm9000的声明extern struct platform_device s3c_device_hsmmc1;extern struct platform_device s3c_device_hsmmc2;extern struct platform_device s3c_device_hsmmc3;extern struct platform_device s3c_device_cfcon;+extern struct platform_device s3c_device_dm9000; /* 声明devs.c中定义的结构体变量s3c_device_dm9000 */extern struct platform_device s3c_device_spi0;
[zhoupiaolong@localhost linux-3.0]$ vim drivers/net/dm9000.c //修改dm9000.c的驱动代码,添加中断的初始化... ... ...static intdm9000_open(struct net_device *dev){board_info_t *db = netdev_priv(dev);- unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;+ unsigned long irqflags = (db->irq_res->flags|IRQ_TYPE_EDGE_RISING) & IRQF_TRIGGER_MASK;++ irq_set_irq_type(dev->irq, IRQ_TYPE_EDGE_RISING);if (netif_msg_ifup(db))dev_dbg(db->dev, "enabling %s\n", dev->name);... ... ...

二、内核配置和编译

Linux的源码编译系统三兄弟的介绍
  • Kconfig:一个文本形式的文件,存在内核源码中的每一个文件夹下,内核配置命令make menuconfig读取相应的Konfig文件生成菜单界面;
  • .config:隐藏文件存放在内核源码顶层目录中,make menuconfig命令配置的结果,里面的每个选项用来指导Makefile哪些C文件需要编译,哪
    些不需要编译;
  • Makefile:一个文本形式的文件,存在内核源码中的每一个文件夹下,用来控制编译该目录下的源码编译;
    通过配置三兄弟得到编译后的fl2440_uimage(含根文件系统,之前的忘记copy一份所以一鼓作气做到后面会含根文件系统):
wget https://gitee.com/kansnow/Linux-fl2400ZuiXiaoXiTongYiZhi/blob/master/linuxroms-s3c2440.bin
原创粉丝点击