Ubuntu驱动程序开发6-Linux内核启动与程序烧写

1 更新uboot到EMMC

1.1 在uboot中更新uboot

  将编译好的u-boot.imx拷贝到Ubuntu中的tftpboot目录下,然后在uboot命令行下执行以下命令

mmc dev 1 0 //切换到EMMC分区0
tftp 80800000 u-boot.imx //下载u-boot.imx到DRAM
mmc write 80800000 2 32E //烧写u-boot.imx到EMMC中,因为u-boot.imx大小416768字节,416768/512=814个块,有小数的话需要再加1个块。要从SD卡分区第2个块(扇区)开始烧写。
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!

1.2 在电脑上通过SD卡更新uboot

1.1 将imxdown拷贝到工程目录下,也就是和u-boot.bin文件在同一个文件夹下

1.2 给予imxdownload可执行权限  

chmod 777 imxdownload

1.3 电脑中插入sd卡(使用 ls /de/sd*来查看确认sd卡是sd多少)

ls /dev/sd*

1.4 烧写bin文件

./imxdownload u-boot.bin /dev/sdd

2 更新内核和设备树文件到EMMC

可以通过MfgTool来烧写到emmc或sd卡,或者使用uboot下的mmc write指令烧写到emmc或sd卡:

  待补充。

3 uboot启动Linux的两种启动方式(通过bootz启动)

3.1 从EMMC启动

先将zImage文件和设备树文件保存到emmc中,详见第2节。

mmc dev 1 //切换到 EMMC
fatload mmc 1:1 0x80800000 zImage //从EMMC读取zImage到DRAM的0x80800000处
fatload mmc 1:1 0x83000000 imx6ull-14x14-evk.dtb //从EMMC读取设备树到DRAM的0x83000000处
bootz 0x80800000 - 0x83000000 //启动 Linux

3.2 从网络启动

tftp 80800000 zImage  //将tftp文件夹里面的zImage文件下载到开发板DRAM的0x80800000地址处
tftp 83000000 imx6ull-alientek-emmc.dtb  //将tftp文件夹里面的imx6ull-alientek-emmc.dtb文件下载到开发板DRAM的0x83000000地址处
bootz 80800000 – 83000000  //启动

4 uboot启动Linux的两种启动方式(通过boot启动)

4.1 从EMMC启动

4.1.1 将zImage和设备树文件保存到EMMC中

  待补充

4.1.2 设置bootargs和bootcmd环境变量

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-alientek-emmc.dtb; bootz 80800000 - 83000000;'
saveenv

4.1.3 启动内核

boot
或者
run bootcmd

4.2 从网络启动

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
saveenv
tftp 80800000 zImage:将tftp文件夹里面的zImage文件下载到开发板DRAM的0x80800000地址处
tftp 83000000 imx6ull-alientek-emmc.dtb:将tftp文件夹里面的imx6ull-alientek-emmc.dtb文件下载到开发板DRAM的0x83000000地址处

5、将根文件系统通过NFS挂载

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

<server-ip>:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP地址,比如我的 Ubuntu 主机 IP 地址为 192.168.1.250。
<root-dir>: 根文件系统的存放路径,比如我的就是/home/mk-linux/nfs/rootfs。
<nfs-options>: NFS 的其他可选选项,一般不设置。
<client-ip>: 客户端 IP 地址,也就是我们开发板的 IP 地址, Linux 内核启动以后就会使用 此 IP 地址来配置开发板。
<server-ip>: 服务器 IP 地址。
<gw-ip>: 网关地址,比如 192.168.1.1。
<netmask>:子网掩码, 255.255.255.0。
<hostname>:客户机的名字,一般不设置,此值可以空着。
<device>: 设备名,也就是网卡名,一般是 eth0, eth1….,正点原子的 I.MX6U-ALPHA 开 发板的 ENET2 为 eth0, ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。 这里我们使用 ENET2,所以网卡名就是 eth0。
<autoconf>: 自动配置,一般不使用,所以设置为 off。
<dns0-ip>: DNS0 服务器 IP 地址,不使用。
<dns1-ip>: DNS1 服务器 IP 地址,不使用。
根据上面的格式 bootargs 环境变量的 root 值如下:

root=/dev/nfs rw nfsroot=192.168.1.250:/home/zuozhongkai/linux/nfs/rootfs ip=192.168.1.251: 192.168.1.250:192.168.1.1:255.255.255.0::eth0:off


原文地址:https://www.cnblogs.com/Mike2019/p/14205687.html