I.MX6ULL ARM Linux学习笔记

I.MX6ULL ARM Linux学习笔记

  • 写在前面
  • S1:U-Boot
  • S2:正点原子U-Boot编译
  • S3:U-Boot基本命令第1讲:help、bdinfo和环境变量命令
  • S4:U-Boot基本命令第2讲:内存操作命令
  • S5:U-Boot基本命令第3讲:网络操作命令
  • S6:U-Boot基本命令第4讲:FAT操作命令
  • S7:U-Boot基本命令第5讲:boot相关操作命令
  • S8:ubuntu下交叉编译工具与传输环境搭建

写在前面

本文章为我在学习I.MX6ULL ARM Linux时的记录文章,知识来源为《正点原子阿尔法 I.MX6ULL ARM Linux开发板》的视频教程和野火《i.MX Linux开发实战指南》的视频和电子书籍。

学习笔记涉及在学习过程中有关安装,使用,编程,debug的相关知识点和技巧,在一套教程学习完毕后,我将再次整理本笔记,将其中重要的坑点,知识点和一些技巧和问题解决等整理成专栏,敬请大家静待花开,谢谢!

S1:U-Boot

I.MX6ULL ARM Linux学习笔记_第1张图片

U-Boot启动界面:(串口)
启动时3秒内按Enter进入U-Boot命令行模式。
I.MX6ULL ARM Linux学习笔记_第2张图片
注意:
1.ARM没有PC机中的BIOS,Uboot就类似于BIOS+系统引导程序
2.U-Boot 最重要的功能就是初始化DDR,并将linux镜像和dts设备数拷贝到内存中。
3.大多数的ARM在引导linux之前都需要U-Boot初始化DDR,但有一些ARM的bootROM(就比如I.MX6ULL)会自动初始化DDR,无需U-Boot再初始化了。

S2:正点原子U-Boot编译

I.MX6ULL ARM Linux学习笔记_第3张图片
I.MX6ULL ARM Linux学习笔记_第4张图片

也可以直接在MakeFile中写好ARCH和CROSS_COMPILE:
I.MX6ULL ARM Linux学习笔记_第5张图片

S3:U-Boot基本命令第1讲:help、bdinfo和环境变量命令

1.help命令:?+命令名
例子:

? boot

2.信息查看命令:板子信息

 bdinfo

3.与环境变量有关的命令:

1.setenv(重点):增,删,改环境变量信息
(注意 字符串和带空格的要加单引号把整个串括起来,单纯数字不用引号)
举例:
新增一个名为author 的环境变量,值为whstudio并保存

setenv author 'whstudio'
saveenv

删除一个名为author 的环境变量并保存(将值置为空就是删除)

setenv author
saveenv

修改一个名为author 的环境变量,值为whstudio并保存(环境变量存在就是修改)

setenv author 'whstudio'
saveenv

2.printenv(重点):查环境变量信息
举例:
查看所有环境变量:

printenv

S4:U-Boot基本命令第2讲:内存操作命令

内存操作命令(阅读说明1):

命令 用途 格式 举例 说明
md 显示内存值 md[.b, .w, .l] address [# of objects] md.b 80000000 14 0X80000000 开始的 20 个字节的内存值
nm 修改指定地址的内存值 nm [.b, .w, .l] address nm.l 80000000 以.l 格式修改 0x80000000 地址的数据为 0x12345678(阅读说明2)
mm 修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增 mm [.b, .w, .l] address mm.l 80000000 以.l 格式修改 0x80000000 为起始地址的数据
mw 使用一个指定的数据填充一段内存 mw [.b, .w, .l] address value [count] mw.l 80000000 0A0A0A0A 10 使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A
cp 数据拷贝命令 cp [.b, .w, .l] source target count cp.l 80000000 80000100 10 使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节)
cmp 比较命令,用于比较两段内存的数据是否相等 cmp [.b, .w, .l] addr1 addr2 count cmp.l 80000000 80000100 10 使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)

说明1:
命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!

说明2:
输入上述命令以后如图 30.4.3.2 所示:
在这里插入图片描述
图 30.4.3.2 nm 命令
在图 30.4.3.2 中,80000000 表示现在要修改的内存地址,ffffff00 表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出,如图 30.4.3.3 所示:
在这里插入图片描述
图 30.4.3.3 修改内存数据
修改完成以后在使用命令 md 来查看一下有没有修改成功,如图 30.4.3.4 所示:
图 30.4.3.4 查看修改后的值
在这里插入图片描述
从图 30.4.3.4 可以看出,此时地址 0X80000000 的值变为了 0x12345678。

S5:U-Boot基本命令第3讲:网络操作命令

要使用网络首先要配置一些环境变量:

环境变量 描述
ipaddr 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址。
ethaddr 开发板的 MAC 地址,一定要设置。
gatewayip 网关地址。
netmask 子网掩码。
serverip 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。

例如:

setenv ipaddr 192.168.1.50 
setenv ethaddr 00:04:9f:04:d2:35 
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.250 
saveenv

注意:
网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP 地址在同一个网段内。

比如我现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50,我的 Ubuntu 主机的地址为 192.168.1.250,因此 serverip 就是192.168.1.250。

ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。

命令 用途 格式 举例 说明
ping 是否可以与指定ip进行通信 ping ip ping 192.168.1.250 注意!只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!
dhcp 用于从路由器获取 IP 地址 dhcp dhcp 直接输入 dhcp 命令即可通过路由器获取到 IP 地址
nfs 通过 nfs 可以在计算机之间通过网络来分享资源 nfs [loadAddress] [[hostIPaddr:]bootfilename] nfs 80800000 192.168.1.250:/home/zuozhongkai/linux/nfs/zImage 使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处 (ubuntu系统上要建立并开启nfs服务)
tftp 通过网络下载东西到 DRAM 中 tftpboot [loadAddress] [[hostIPaddr:]bootfilename] tftp 80800000 zImage 将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处 (ubuntu系统上要建立并开启tftp服务)

注意点1:
nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。

注意点2:
I.MX6ULL ARM Linux学习笔记_第6张图片
在图 中可以看到“TFTP error: ‘Permission denied’ (0)”这样的错误提示,提示没有权限,出现这个错误一般有两个原因:
①、在 Ubuntu 中创建 tftpboot 目录的时候没有给予 tftboot 相应的权限。
②、tftpboot 目录中要下载的文件没有给予相应的权限。
针对上述两个问题,使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹。

S6:U-Boot基本命令第4讲:FAT操作命令

S7:U-Boot基本命令第5讲:boot相关操作命令

S8:ubuntu下交叉编译工具与传输环境搭建

安装VScode
VScode其实在linux下可以直接运行,不需要安装
我们要做的是给文件夹找一个合适的位置,然后把开始菜单和桌面的程序图标加进去

第一步:下载VScode
在Visual Studio Code官网下载:
VScode linux 64位

第二步:解压缩文件

tar -xvzf code-stable-1536736541.tar.gz

第三步:移动到/usr/local/ 目录,给可执行的权限, 然后就已经可以运行了

mv VSCode-linux-x64 /usr/local/
chmod +x /usr/local/VSCode-linux-x64/code

第四步:添加到开始菜单和桌面
复制一个VScode图标文件到 /usr/share/icons/ 目录(后面会有用),并且编辑VSCode.desktop

cp /usr/local/VSCode-linux-x64/resources/app/resources/linux/code.png /usr/share/icons/
vim /usr/share/applications/VSCode.desktop

然后这样写:

[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux
Exec=/usr/local/VSCode-linux-x64/code
Icon=/usr/share/icons/code.png
Type=Application
StartupNotify=true
Categories=TextEditor;Development;Utility;
MimeType=text/plain;

保存退出,在开始菜单里面应该就看到VScode了。
如果想要桌面上也存在,就这样:

cp /usr/share/applications/VSCode.desktop ~/桌面位置

安装交叉编译器

通常编译工具链对编译环境有较高的要求,编译复杂的程序时,可能需要巨大的存储空间以及强大的 CPU 运算能力加快编译速度。常见的ARM 架构平台资源有限,无论是存储空间还是 CPU 运算能力,都与 PC 相去甚远,特别是对于 MCU 平台,安装编译器根本无从谈起。有了交叉编译,我们就可以在 PC 上快速编译出针对其他架构的可执行程序。

安装过程非常简单,apt安装即可:

sudo apt install gcc-arm-linux-gnueabihf

安装NFS server和挂载NFS目录

第零步:ubuntu和板子处于一个路由器内,并相互ping成功

第一步:虚拟机设置,实体机请跳过:

网络连接选择桥接并勾选复制物理网络连接状态:
I.MX6ULL ARM Linux学习笔记_第7张图片
笔记本中经常会有两个或者两个以上的网卡,根据需要进行如下设置:
I.MX6ULL ARM Linux学习笔记_第8张图片
再点击管理员模式:
I.MX6ULL ARM Linux学习笔记_第9张图片
在里面选择直通(近似可以这样理解)的网卡即可。

总之,大家的电脑和虚拟机不同,不管如何折腾或者怎么连接,目的就是虚拟机和板子之间可以互相Ping成功
ubuntu ping 板子:
I.MX6ULL ARM Linux学习笔记_第10张图片

板子ping ubuntu :
I.MX6ULL ARM Linux学习笔记_第11张图片

第二步:安装NFS server和挂载NFS目录

apt安装即可:

sudo apt-get install nfs-kernel-server

查看id:

id

记下uid(用户id) 和gid(组id),接下来要用。

安装 NFS 服务后,会新增一个/etc/exports 文件(即/etc 目录下名字为 exports 的文件),
NFS 服务根据它的配置来运行。
这里我们直接使用shell命令修改一下:

sudo echo "/home/pibot/nfs  *(rw,sync,all_squash,anonuid=????,anongid=????,no_subtree_check)" > /etc/exports
sudo exportfs -arv

别忘了把uid和gid填入问号里面去

这里面的*代表所有ip均可以访问,当然也可以指定ip,把它换成:ip/24即可
把/home/pibot/nfs换成你想要挂上去的文件夹

板子设置:

mkdir /home/root/mountnfs
mount -o vers=4 192.168.0.128:/home/pibot/nfs /home/root/mountnfs


执行过去了,就基本正常了,再去挂载目录下看

在这里插入图片描述
文件过来了,搞定!

你可能感兴趣的:(Linux,学习笔记)