U-Boot烧写验证测试
正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做“imxdownload”
【1】将 imxdownload 拷贝到工程根目录下
【2】给予 imxdownload 可执行权限
我们直接将软件 imxdownload 从 Windows 下复制到 Ubuntu 中以后, imxdownload 默认是没有可执行权限的。我们需要给予 imxdownload 可执行权限,使用命令“chmod”,命令如下:
chmod 777 imxdownload
当给予 imxdownload 可执行权限以后其名字变成了绿色的,如果没有可执行权限的话其名字颜色是白色的。所以在 Ubuntu 中我们可以初步的从文件名字的颜色判断其是否具有可执行权限。
【3】确定要烧写的 SD 卡。
准备一张新的 SD(TF)卡,确保 SD 卡里面没有数据,因为我们在烧写代码的时候可能会格式化 SD 卡!!!
Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。我们要先看一下不插 SD 卡的时候电脑都有哪些存储设备,以防插入 SD 卡以后分不清谁是谁。输入如下所示命令:
ls /dev/sd*
用读卡器将 SD 卡插到电脑
如果你的电脑没有找到 SD 卡的话,尝试重启一下 Ubuntu 操作!
拓展:
如果你的电脑没有找到 SD 卡,且重启Ubuntu 也还是无法识别到SD卡(U盘)可尝试做如下操作:
这种情况一般是插入USB设备后,”USB设备“都无法在Ubuntu下识别,且VMware中“连接(断开与主机连接)©”为灰色不可选中状态,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrZEWe9v-1675180576787)(…\Linux驱动开发记录\Linux驱动开发记录图库\连接灰色.png)]
解决:首先关闭虚拟机系统,找到当前虚拟机的安装目录,找到【.vmx】文件,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZHcdJhn-1675180576788)(…\Linux驱动开发记录\Linux驱动开发记录图库.vmx文件目录.png)]
选用记事本工具打开,找到【usb.restrictions.defaultAllow = “FALSE”】配置,将“FALSE”修改为“TRUE”,然后保存并关闭文件,再次启动虚拟机系统,此时虚拟机就能正常识别“U盘设备”了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JuAN66bM-1675180576788)(…\Linux驱动开发记录\Linux驱动开发记录图库\解决VMware能识别usb设备,但无法连接(灰色)问题.png)]
然后我们再次输入【ls /dev/sd* 】指令,即可确认我们的SD卡的设备类型,【/dev/sdc】即是我的 SD 卡
【4】向 SD 卡烧写 bin 文件
使用 imxdownload 向 SD 卡烧写 .bin 文件,命令格式如下:
./imxdownload <.bin file> <SD Card>
其中.bin 就是要烧写的.bin 文件, SD Card 就是你要烧写的 SD 卡
4.1 烧写 u-boot.bin 到/dev/sdc 中
./imxdownload u-boot.bin /dev/sdc # 不能烧写到/dev/sda 或 sda1 设备里面!那是系统磁盘
烧写的过程中可能会让你输入密码,输入你的 Ubuntu 密码即可完成烧写,烧写的最后一行会显示烧写大小、用时和速度 。注意这个烧写速度,如果这个烧写速度在几百 KB/s 以下那么就是正常烧写。如果这个烧写速度大于几十 MB/s、甚至几百 MB/s 那么肯定是烧写失败了!
烧写完成以后将 SD 卡插入 I.MX6U-ALPHA 开发板的 TF 卡槽中,最后设置开发板从 SD卡启动。
uboot 启动正常,虽然我们用的是 NXP 官方 I.MX6ULL 开发板的uboot,但是在正点原子的 I.MX6ULL 开发板上是可以正常启动的。而且 DRAM 识别正确,为512MB 。
4.2 SD 卡和 EMMC 驱动检查
检查一下 SD 卡和 EMMC 驱动是否正常,使用命令 mmc list 列出当前的 MMC 设备
mmc list
可以看出当前有两个 MMC 设备,检查每个 MMC 设备信息,先检查 MMC 设备 0,输入如下命令:
mmc dev 0
mmc info
可以看出, mmc 设备 0 是 SD 卡, SD 卡容量为 14.8GB,这个和我所使用的SD 卡信息相符,说明 SD 卡驱动正常。
再来检查 MMC 设备 1,输入如下命令:
mmc dev 1
mmc info
可以看出, mmc 设备 1 为 EMMC,容量为 7.3GB,说明 EMMC 驱动也成功,SD 卡和 EMMC 的驱动都没问题。
4.3 LCD 驱动检查
如果 uboot 中的 LCD 驱动正确的话,启动 uboot 以后 LCD 上应该会显示出 NXP 的 logo
如果你用的不是正点原子的 4.3 寸 480x272 分辨率的屏幕的话,那么 LCD 就不会显示 以上logo 界面。因为 NXP 官方 I.MX6ULL 开发板的屏幕就是 4.3 寸 480x272 分辨率的,所以 uboot 默认 LCD 驱动是 4.3 寸 480x272 分辨率的。如果使用其他分辨率的 LCD 就需要修改 LCD 驱动。(因为我本次试验用就是正点原子 4.3 寸 480x272 分辨率的屏幕,故NXP logo正常显示)
4.4 网络驱动检查
uboot 启动的时候提示“Board Net Initialization Failed”和“No ethernet found.”这两行,说明网络驱动也有问题。 正常情况下应该是如图 :
这是因为正点原子开发板的网络芯片复位引脚和 NXP 官方开发板不一样,因此需要修改驱动。 修改完网络驱动,重新编译 uboot,然后将 u-boot.bin 烧写到 SD 卡中并启动, uboot 启动信息如图
可以看到“Net: FEC1”这一行,提示当前使用的 FEC1 这个网口,也就是 ENET2。
网络报错Error: FEC1 address not set
原因是没有网络配置,因此需要设置如下网络信息
setenv ipaddr 192.168.1.55 # 开发板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00 # 开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1 # 开发板默认网关
setenv netmask 255.255.255.0 # 开发板子网掩码
setenv serverip 192.168.1.106 # 服务器地址,也就是 Ubuntu 地址
saveenv # 保存环境变量
设置好环境变量以后就可以在 uboot 中使用网络了,用网线将 I.MX6U-ALPHA 上的 ENET2与电脑或者路由器连接起来,保证开发板和电脑在同一个网段内,通过 ping 命令来测试一下网络连接,命令如下:
ping 192.168.1.106
可以看出,有“host 192.168.1.250 is alive”这句,说明 ping 主机成功,说明ENET2网络工作正常。再来测试一下 ENET1 的网络是否正常工作,打开 mx6ullatk.h,将 CONFIG_FEC_ENET_DEV 改为 0,然后重新编译一下 uboot 并烧写到 SD 卡中重启。重启开发板。
(注:正点原子Mini LinuxI.MX6ULL只有一个网络接口ENET2,我这里使用的是Mini LinuxI.MX6ULL开发板,所以只验证了NET2网络)。
建议大家将ENET2 设置为 uboot 的默认网卡!也就是将宏 CONFIG_FEC_ENET_DEV 设置为 1。
4.5 uboot 启动 Linux 测试
我们测试两种启动 Linux 内核的方法,一种是直接从 EMMC 启动,一种是从网络启动。
4.5.1 从 EMMC 启动 Linux 系统
从 EMMC 启动也就是将编译出来的 Linux 镜像文件 zImage 和设备树文件保存在 EMMC中, uboot 从 EMMC 中读取这两个文件并启动。
正点原子出厂的I.MX6U-ALPHA 开发板(EMMC 版本)已经将 zImage 文件和设备树文件烧写到了 EMMC 中,所以我们可以直接读取来测试。先检查一下 EMMC 的分区 1 中有没有zImage 文件和设备树文件,输入命令“ls mmc 1:1”,结果如图
设置 bootargs 和 bootcmd这两个环境变量,设置如下:(因为我的开发配的是4.3寸,480x272分辨率的屏,所以选择imx6ull-14x14-emmc-4.3-480x272-c.dtb设备树文件)
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-480x272-c.dtb; bootz 80800000 - 83000000;'
设置好以后直接输入 boot,或者 run bootcmd 即可启动 Linux 内核 。如果 Linux 内核启动成功的话就会输出如图
4.5.2 从网络启动 Linux 系统
从网络启动 linux 系统的唯一目的就是为了调试!不管是为了调试 linux 系统还是 linux 下的驱动。每次修改 linux 系统文件或者 linux 下的某个驱动以后都要将其烧写到 EMMC 中去测试,这样太麻烦了。
我们可以设置 linux 从网络启动,也就是将 linux 镜像文件和根文件系统都放到 Ubuntu 下某个指定的文件夹中,这样每次重新编译 linux 内核或者某个 linux 驱动以后只需要使用 cp 命令将其拷贝到这个指定的文件夹中即可,这样就不用需要频繁的烧写 EMMC,这样就加快了开发速度。
我们可以通过 nfs 或者 tftp 从 Ubuntu 中下载 zImage 和设备树文件,根文件系统的话也可以通过 nfs 挂载。这里我们使用 tftp 从 Ubuntu 中下载 zImage 和设备树文件,前提是要将 zImage 和设备树文件放到 Ubuntu 下的 tftp 目录中。
设置 bootargs 和 bootcmd 这两个环境变量,设置如下:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-4.3-480x272-c.dtb; bootz 80800000 - 83000000'