这节进行一个linux内核的移植。
一。内核源码的下载
内核源码官网
进入官网
点击 红框 下载
我们这里选用linux3.14版本,移植的思路是相同的。
二。内核的配置编译
1.现在我们有官方源码了,通过共享文件夹传入到linux虚拟机中。
cp windows_file/linux-3.14.tar.xz ~/mytest
2.Linux系统中解压 ( tar -xvf linux-3.14.tar.xz 注意不能在与window的共享目录解压)
3.修改Makefile 指定交叉编译工具链
(可以通过 1》make menuconfig进行设置,2》也可以直接vim Makefile进行设置
vim Makefile (198行)
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
3》也可以不指定直接使用指令 make ARCH=arm exynos_defconfig,
这里就直接从Makefile文件中改的。
)
4.导入配置 make exynos_defconfig(配置列表见 arch/arm/configs/ 找最类似的,也许直接可以用偶)
先不修改,进行内核和设备树的编译先试一下,保持最小的改动。注意生成的固件名称要和boot中指定的参数要一致。(不然怎么启动啊。bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
)
5. make uImage 编译内核
make dtbs 编译设备树(现在最新版本的内核都是使用设备树了)
使用 linux-4.4.82/arch/arm/boot/uImage 和
linux-4.4.82/arch/arm/boot/dts/exynos4412-origen.dtb
将两个固件复制到我们的/tftpboot/目录下,进行板卡启动。
至此没有异常的话可以正常启动 linux,
但是挂载不了根文件系统,因为没有配置网卡驱动(NFS服务无法使用)
6.make menuconfig 进行菜单配置
我们知道了需要配置我们的网卡驱动。执行命令后,报错了。
make menuconfig‘ requires the ncurses libraries.
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
然后执行以下命令:
sudo apt-get install ncurses-dev
然后再make menuconfig 就没有问题了
进入菜单,主要配置网络协议支持TCP/IP
配置网络支持网络文件系统NFS
File systems-》Network File Systems--》
配置支持Dm9000网卡
Device Drivers--》Network device support--》Ethernet driver support--》
菜单配置完了,
这回可以正常执行了吧?其实是不确定的,因为每家的开发板是不一样的,使用的硬件接口也可能不同,
所以还需要我们改一下硬件的对应关系,从设备树中添加。
配置设备树描述网卡和CPU的链接情况
srom-cs1@5000000 {
compatible = “simple-bus”;
#address-cells = 《1》;
#size-cells = 《1》;
reg = 《0x5000000 0x1000000》; 对应芯片手册 3 Memory Map 的0x0500_0000 和 16 MB
ranges;
ethernet@5000000 {
compatible = “davicom,dm9000”; 内核通过该名字来匹配驱动
reg = 《0x5000000 0x2 0x5000004 0x2》; 寄存器地址和数据宽度
interrupt-parent = 《&gpx0》; 继承于 中断控制器gpx0
interrupts = 《6 4》; 6 对应中断源 DM9000_IRQ -》 XEINT6 。
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};
找到firmware的节点,然后将他注释掉:
firmware@0203F000 {
compatible = “samsung,secure-firmware”;
reg = 《0x0203F000 0x1000》;
};
为:
/* firmware@0203F000 {
compatible = “samsung,secure-firmware”;
reg = 《0x0203F000 0x1000》;
}; */
为什么要注释掉这段代码,有的时候需要,有的时候不需要,和uboot相关需要添加备注: firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。
设备树中的含义之后详细说,
如果还是不能正常挂载可以
修改文件driver/clk/clk.c static bool clk_ignore_unused;改为static bool clk_ignore_unused = true;
此时在编译内核和设备树,然后板卡就能正常启动了。
这节进行一个linux内核的移植。
一。内核源码的下载
内核源码官网
进入官网
点击 红框 下载
我们这里选用linux3.14版本,移植的思路是相同的。
二。内核的配置编译
1.现在我们有官方源码了,通过共享文件夹传入到linux虚拟机中。
cp windows_file/linux-3.14.tar.xz ~/mytest
2.Linux系统中解压 ( tar -xvf linux-3.14.tar.xz 注意不能在与window的共享目录解压)
3.修改Makefile 指定交叉编译工具链
(可以通过 1》make menuconfig进行设置,2》也可以直接vim Makefile进行设置
vim Makefile (198行)
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
3》也可以不指定直接使用指令 make ARCH=arm exynos_defconfig,
这里就直接从Makefile文件中改的。
)
4.导入配置 make exynos_defconfig(配置列表见 arch/arm/configs/ 找最类似的,也许直接可以用偶)
先不修改,进行内核和设备树的编译先试一下,保持最小的改动。注意生成的固件名称要和boot中指定的参数要一致。(不然怎么启动啊。bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
)
5. make uImage 编译内核
make dtbs 编译设备树(现在最新版本的内核都是使用设备树了)
使用 linux-4.4.82/arch/arm/boot/uImage 和
linux-4.4.82/arch/arm/boot/dts/exynos4412-origen.dtb
将两个固件复制到我们的/tftpboot/目录下,进行板卡启动。
至此没有异常的话可以正常启动 linux,
但是挂载不了根文件系统,因为没有配置网卡驱动(NFS服务无法使用)
6.make menuconfig 进行菜单配置
我们知道了需要配置我们的网卡驱动。执行命令后,报错了。
make menuconfig‘ requires the ncurses libraries.
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
然后执行以下命令:
sudo apt-get install ncurses-dev
然后再make menuconfig 就没有问题了
进入菜单,主要配置网络协议支持TCP/IP
配置网络支持网络文件系统NFS
File systems-》Network File Systems--》
配置支持Dm9000网卡
Device Drivers--》Network device support--》Ethernet driver support--》
菜单配置完了,
这回可以正常执行了吧?其实是不确定的,因为每家的开发板是不一样的,使用的硬件接口也可能不同,
所以还需要我们改一下硬件的对应关系,从设备树中添加。
配置设备树描述网卡和CPU的链接情况
srom-cs1@5000000 {
compatible = “simple-bus”;
#address-cells = 《1》;
#size-cells = 《1》;
reg = 《0x5000000 0x1000000》; 对应芯片手册 3 Memory Map 的0x0500_0000 和 16 MB
ranges;
ethernet@5000000 {
compatible = “davicom,dm9000”; 内核通过该名字来匹配驱动
reg = 《0x5000000 0x2 0x5000004 0x2》; 寄存器地址和数据宽度
interrupt-parent = 《&gpx0》; 继承于 中断控制器gpx0
interrupts = 《6 4》; 6 对应中断源 DM9000_IRQ -》 XEINT6 。
davicom,no-eeprom;
mac-address = [00 0a 2d a6 55 a2];
};
};
找到firmware的节点,然后将他注释掉:
firmware@0203F000 {
compatible = “samsung,secure-firmware”;
reg = 《0x0203F000 0x1000》;
};
为:
/* firmware@0203F000 {
compatible = “samsung,secure-firmware”;
reg = 《0x0203F000 0x1000》;
}; */
为什么要注释掉这段代码,有的时候需要,有的时候不需要,和uboot相关需要添加备注: firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。
设备树中的含义之后详细说,
如果还是不能正常挂载可以
修改文件driver/clk/clk.c static bool clk_ignore_unused;改为static bool clk_ignore_unused = true;
此时在编译内核和设备树,然后板卡就能正常启动了。
举报