正点原子imx6ull-mini移植文件系统

11 篇文章 0 订阅
9 篇文章 0 订阅

上一节移植的网络驱动,我去ifconfig eth0 up看并不是SMSC,而是gen PHY,用原子的zImage依旧存在这个问题,所以我暂且认为这并不是我造成的错误。那就接着用通用驱动呗。

一:修改Make file,这都是老演员了,每个工程都会区修改ARCH和CROSS_COMPILE这两个变量

CROSS_COMPILE ?= CROSS_COMPILE ?=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-

ARCH ?= arm

用绝对路径的目的是为了防止编译报错。

二:支持中文的修改,原来的文件默认是支持ASCII的,也就是0~127个字符

2.1:打开文件 /libbb/printable_string.c,找到函数 printable_string,缩减后的函数,其实就是注释掉边界0x7f==127相关代码


const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
{
	char *dst;
	const char *s;

	s = str;
	while (1) {
		unsigned char c = *s;
		if (c == '\0') {
			/* 99+% of inputs do not need conversion */
			if (stats) {
				stats->byte_count = (s - str);
				stats->unicode_count = (s - str);
				stats->unicode_width = (s - str);
			}
			return str;
		}
		if (c < ' ')
			break;
		/*if (c >= 0x7f)
			break;*/
		s++;
	}

#if ENABLE_UNICODE_SUPPORT
	dst = unicode_conv_to_printable(stats, str);
#else
	{
		char *d = dst = xstrdup(str);
		while (1) {
			unsigned char c = *d;
			if (c == '\0')
				break;
			if (c < ' ' )
				*d = '?';
			d++;
		}
		if (stats) {
			stats->byte_count = (d - dst);
			stats->unicode_count = (d - dst);
			stats->unicode_width = (d - dst);
		}
	}
#endif
	return auto_string(dst);
}

2.2:以同样的方式修改/libbb/unicode.c里的unicode_conv_to_printable2

*d++ = (c >= ' ') ? c : '?';
if (c < ' ')

三:图形化配置busybox

3.1:取消选中Build static binary(no shared libs)

3.2:选中 vi-style line editing commands

3.3:取消选中Simplified modutils

3.4:选中mdev (16 kb)

3.5:选中Support Unicode和Check $LC_ALL, $LC_CTYPE and $LANG environment variables

四:编译busybox

make
make install CONFIG_PREFIX=~/linux/nfs/rootfs

五:向根文件系统添加lib库

5.1:在rootfs目录建立lib目录

mkdir lib

5.2:拷贝文件

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

5.2.1:此目录下有很多的*so*(*是通配符)和.a 文件,这些就是库文件,将此目录下所有的*so*和.a 文件都拷贝到 rootfs/lib 目录中,拷贝命令如下:

cp *so* *.a ~/linux/nfs/rootfs/lib/ -d

5.2.2:“-d”表示拷贝符号链接,这里有个比较特殊的库文件:ld-linux-armhf.so.3,此库文件也是个符号链接,相当于 Windows 下的快捷方式。会链接到库 ld-2.19-2014.08-1-git.so 上,输 入命令“ls ld-linux-armhf.so.3 -l”查看此文件详细信息

ls ld-linux-armhf.so.3 -l

5.2.3:软连接相当于一个复制品,只知道去哪找本尊,单本身不具有本尊的能力,所以我们要删掉软连接,把本尊(绿色的复制到lib目录下)

cd ~/linux/nfs/rootfs/lib
rm ld-linux-armhf.so.3

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib
cp ld-linux-armhf.so.3 ~/linux/nfs/rootfs/lib/

cd ~/linux/nfs/rootfs/lib
ls ld-linux-armhf.so.3

5.2.4:接着进入/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib复制

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a ~/linux/nfs/rootfs/lib/ -d

cd ~/linux/nfs/rootfs/lib ; ls

5.3: 向 rootfs 的“usr/lib”目录添加库文件

5.3.1:在usr目录下新建lib目录

5.3.2:拷贝usr内的库文件

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a ~/linux/nfs/rootfs/usr/lib/ -d

5.3.3: 至此,根文件系统的库文件就全部添加好了,可以使用“du”命令来查看一下 rootfs/lib 和 rootfs/usr/lib 这两个目录的大小,命令如下:

cd ~/linux/nfs/rootfs/
du ./lib ./usr/lib -sh

5.3.4:创建其它目录

mkdir dev;mkdir mnt;mkdir proc;mkdir root;mkdir sys;mkdir tmp;

建议把这个配置好的文件系统拷贝一份,以防万一误操作。

5.4:根文件系统初步测试

5.4.1:配置bootargs

接下来我们使用测试一下前面创建好的根文件系统 rootfs,测试方法就是使用 NFS 挂载uboot 里面的 bootargs 环境变量会设置“root”的值,所以我们将 root 的值改为 NFS 挂载即可。 在 Linux 内核源码里面有相应的文档讲解如何设置,文档为 Documentation/filesystems/nfs/ nfsroot.txt,格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

根据上面的格式 bootargs 环境变量的 root 值如下:

root=/dev/nfs nfsroot=192.168.1.250:~/linux/nfs/rootfs,proto=tcp rw
ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off

“proto=tcp”表示使用 TCP 协议,“rw”表示 nfs 挂载的根文件系统为可读可写。启动开发 板,进入 uboot 命令行模式,然后重新设置 bootargs 环境变量,命令如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.31.197:/home/zhulinux/linux/nfs/rootfs,proto=tcp rw ip=192.168.31.190:192.168.31.197:192.168.31.1:255.255.255.0::eth0:off' //设置 bootargs
saveenv //保存环境变量



//nfsroot=192.168.31.197 ubuntuIP地址
//ip=192.168.31.190:192.168.31.197:192.168.31.1:255.255.255.0
//依次是 板子IP Ubuntu IP 网口 IP(也就是...1)子网掩码固定的

注意这里的挂载路径要用绝对路径。相对路径我试了出错,挂载不上。

5.4.2 : 完善根文件系统

5.4.2.1:创建/etc/init.d/rcS 文件

rcS 是个 shell 脚本,Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件 的脚本文件。在 rootfs 中创建/etc/init.d/rcS 文件

cd ~/linux/nfs/rootfs
mkdir etc/init.d
touch rcS
gedit rcS
chmod 777 rcS
#!/bin/sh
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
5.4.2.2: 创建/etc/fstab 文件

cd ~/linux/nfs/rootfs/etc
touch fstab
gedit fatab
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0

再次启动linux内核

5.4.2.3:创建/etc/inittab 文件

cd ~/linux/nfs/rootfs/etc
touch inittab
gedit inittab
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

6:软件运行测试

6.1:交叉编译C程序测试

在Ubuntu下写个c语言小程序

cd ~/linux/nfs/rootfs
mkdir drivers
cd drivers
touch hello.c
gedit hello.c
#include <stdio.h>
 
int main(void)
{
    while(1) {
    printf("hello world!\r\n");
    sleep(2);
    }
    return 0;
}

 利用交叉编译器编译成能在ARM架构上运行的程序

arm-linux-gnueabihf-gcc hello.c -o hello

file hello //查看 hello 的文件类型以及编码格式

重启linux内核,在串口中输入

cd /drivers //进入 drivers 目录
./hello //执行 hello

要想 终止 hello 的运行,按下“ctrl+c”组合键即可,“./hello &”就是让 hello 在后台运行

在后台运 行的软件可以使用“kill -9 pid(进程 ID)”命令来关闭掉,首先使用“ps”命令查看要关闭的软 件 PID 是多少,ps 命令用于查看所有当前正在运行的进程,并且会给出进程的 PID。

kill -9 75

6.2: 中文字符测试

在rootfs/drivers中创建一个中文txt文档,再次启动linux内核

6.3:开机自启动测试

测试 hello 软件的时候都是等 Linux 启动进入根文件系统以后手动输入命令 “./hello”来完成的。

进入根文件系统的时候 会运行/etc/init.d/rcS 这个 shell 脚本,因此我们可以在这个脚本里面添加自启动相关内容。

修改rcS脚本

#!/bin/sh
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH

mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s


#开机自启动
cd /drivers
./hello &
cd /

也就是添加了3行代码

6.4:外网连接测试

网站的连接测试,而是百度、淘宝等这些网站的测试。也 就是说看看我们的开发板能不能上网,能不能和我们的局域网外的这些网站进行通信。测试方 法很简单,就是通过 ping 命令来 ping 一下百度的官网:www.baidu.com。输入如下命令

ping www.baidu.com

可以看出,测试失败,提示 www.baidu.com 是个“bad address”,也就是地址不对,显然我 们的地址是正确的。之所以出现这个错误提示是因为 www.baidu.com 的地址解析失败了,并没 有解析出其对应的 IP 地址。我们需要配置域名解析服务器的 IP 地址,一般域名解析地址可以 设置为所处网络的网关地址,比如 192.168.1.1。也可以设置为 114.114.114.114,这个是运营商 的域名解析服务器地址。 在 rootfs 中新建文件/etc/resolv.conf,然后在里面输入如下内容:

cd ~/linux/nfs/rootfs
cd etc
touch resolv.conf
gedit resolv.conf
nameserver 114.114.114.114 //电信的域名服务器好像
nameserver 192.168.31.1 //自己网关

至此三巨头算结束了

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要启动正点原子imx6ull设备,你需要按照以下步骤进行操作: 1. 将正点原子的镜像解压到Ubuntu虚拟机中。 2. 进入设备树文件所在目录。使用命令`cd arch/arm/boot/dts`进入该目录。 3. 修改设备树文件(imx6ull-alientek-emmc.dts),可以使用`code imx6ull-alientek-emmc.dts`命令打开该文件进行编辑。 4. 在设备树文件中进行必要的修改,以防止LED灯占用。具体的修改内容需要根据你的需求和设备的具体情况来确定。 5. 编译内核和设备树。根据你提供的信息,你可能需要使用NXP提供的U-boot和Linux版本进行编译。确保你已经安装了相应的编译工具链和依赖库。 6. 根据你的开发板型号和版本,选择正确的启动方式。具体的启动步骤可能因为不同的开发板而有所不同,你可以参考正点原子提供的文档或者官方指南来进行操作。 7. 遵循正确的启动顺序,按照正点原子提供的说明进行启动。 需要注意的是,以上步骤仅供参考,具体操作可能因为你的环境和需求而有所不同。请仔细阅读相关文档和官方指南,并根据实际情况进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [正点原子 imx6ull linux 更新内核与设备树 通过nfs挂载](https://blog.csdn.net/hk2121/article/details/129665151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [正点原子IMX6ULL开发板-liunx内核移植例程-uboot卡在Starting kernel...问题](https://blog.csdn.net/Qiuhongim/article/details/129287967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值