所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级linux命令ls,和更多的时间吧!
Linux系统&驱动其它文章:
本文为《【正点原子】I.MX6U嵌入式Linux驱动开发手册V1.5.1》中学习笔记
为了便捷调试,通常通过网路形式启动Linux,假如每次更改Linux系统文件或则linux下的某个驱动之后都要将其烧讲到EMMC中去测试,这样太麻烦;
只需将linux镜像文件和根文件系统都放在Ubuntu下linux系统host文件,这样每次重新编译linux内核或则某个linux驱动,只需cp将其拷贝到这个指定的文件夹中即可;
tftp从Ubuntu中下载zImage和设备树文件,通过nsf挂载根文件系统;
首先应对nsf和tftp进行安装配置:
1.nsf、tftp安装和配置
配置工作基本分四步:
1.1nsf
通常Linux驱动在开发中通过nfs(NetworkFileSystem)挂载根文件系统,当产品最终上市开售的时侯就会将根文件系统烧讲到EMMC或则NAND中。
①安装NFS服务:
sudo apt-get install nfs-kernel-server rpcbind
②在linux下创建nfs文件夹供nfs服务器使用:
mkdir /home/chunn/linux/nfs
③修改nfs配置文件:
sudo vi /etc/exports
在最后添加:
/home/chunn/linux/nfs*(rw,sync,no_root_squash)
④重启NFS服务,使用命令如下:
sudo /etc/init.d/nfs-kernel-server restart
⑤检查nfs服务器中挂载的目录。
showmount -e
配置到此结束,接出来就是在nfs目录下预制构件根目录系统。
PS:博主之前只想快速开发驱动,而忽视nfs的配置,检测挂载的目录时:
本文ubuntu系统使用的正点原子提供的镜像文件,所以默认还是alientek的用户名,因而导致内核恐慌,一直挂载失败~
1.2tftp
tftp(TrivialFileTransferProtocol)命令的作用和nfs命令一样国内linux主机,都是用于通过网路下载东西到DRAM中,只是tftp命令使用的TFTP合同,Ubuntu主机作为TFTP服务器。
①安装:
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
②在linux下创建tftp文件夹供tftp服务器使用,并给权限:
mkdir /home/chunn/linux/tftpboot
chmod 777 /home/chunn/linux/tftpboot
③修改tftp的配置文件:
sudo vi /etc/xinetd.d/tftp
# /etc/xinetd.d/tftp
server tftp
{
socket_type = dgram #socket的链接类型是dgram(UDP)
protocol = udp #UDP协议
wait = yes #等待到启动完成
disable = no #yes表示TFTP服务器是关闭的;no表示启动TFTP服务器
user = root #指定root用户启动服务进程
server = /usr/sbin/in.tftpd #指定服务进程是/usr/sbin/in.tftpd
server_args = -s /home/chunn/linux/tftp -c #指定传给该进程的参数(确定目录)
#log_on_success += PID HOST DURATION
#log_on_failure += HOST
per_source = 11 #表示每一个ip地址上最多可以建立的实例数目
cps =100 2 #表示每秒100个入站链接,如果超过限制,则等待2秒
flags =IPv4 #IPv4网络
}
④修改tftp-hpa的配置文件:
sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/chunn/linux/tftp" #TFTP服务器的目录设置
TFTP_ADDRESS=":69" #ip地址和端口号
TFTP_OPTIONS="--secure"
⑤重启tftp
sudo service tftpd-hpa restart
配置到此结束linux系统host文件,还须要把zImage拷贝到tftp中目录,并下载
2.uboot环境变量配置
使用SecureCRT步入uboot,输入uboot指令进行网路环境变量设置
2.1设置IP
setenv ethaddr 00:04:9f:04:d2:35 //硬件地址
setenv gatewayip 192.168.1.1 //网关
setenv ipaddr 192.168.1.103 //开发板的IP地址
setenv netmask 255.255.255.0 //子网掩码
setenv serverip 192.168.1.102 //Ubuntu的IP地址(可以通过ifconfig查询)
saveenv //保存环境变量
2.2设置bootcmd(tftp下载zImage和设备树)
bootcmd:其名分为“boot”和“cmd”,也就是“引导”和“命令”,虽然就是启动的命令集合,如下为使用tftp从网路启动Linux(验证通过的):
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
saveenv
●bootcmd设置的内容:
1) tftp 80800000 zImage : (tftpboot [loadAddress] [[hostIPaddr:]bootfilename] )
将 tftpboot 文件夹里面的 zImage 文件下载到DRAM的0X80800000地址处;
2) tftp 83000000 imx6ull-alientek-emmc.dtb;
将设备树imx6ull-14x14-emmc-7-1024x600-c.dtb 下载到 DRAM 中的 0X83000000 地址处
3) bootz 80800000 - 83000000
使用命令 bootz 启动
●指令:
setenv bootcmd : 设置bootcmd 变量,后续有空格,所以加上引号
saveenv : 保存环境变量
●注意:
1) Ubuntu 中创建 tftpboot 目录的时需要给予 tftboot 相应的权限。
2) tftpboot 目录中要下载的文件没有给予相应的权限
使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹
2.3设置bootargs(从nfs挂载根文件系统)
bootargs保存着uboot传递给Linux内核的参数,主要拿来告诉内核分区信息和根文件系统所在的分区等
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.0.102:/home/chunn/linux/nfs/rootfs ip=192.168.0.103:192.168.0.102:192.168.0.1:255.255.255.0::eth0:off'
saveenv
●nfs挂载的bootargs格式如下:
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>
<server-ip>:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP
地址,比如我的 Ubuntu 主机 IP 地址为 192.168.0.102。
<root-dir> :根文件系统的存放路径,比如我的就是/home/chunn/linux/nfs/rootfs。
<nfs-options>:NFS 的其他可选选项,一般不设置。
<client-ip> :开发板的 IP 地址,Linux 内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能 ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为 192.168.0.103。
<server-ip> :服务器 IP 地址,前面已经说了。
<gw-ip> :网关地址,我的就是 192.168.0.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 地址,不使用。
其它解释:
1)console=ttymxc0,115200 :ttymxc0(也就是串口 1)作为 Linux 的终端,并且串口波特率设置为 115200
2)“rw” : 表示 nfs 挂载的根文件系统为可读可写。
3.过程梳理
1)在ubuntu中配置好nsf、tftp服务,关键步骤:
sudo vi /etc/exports //nfs配置
sudo vi /etc/xinetd.d/tftp //tft配置
sudo vi /etc/default/tftpd-hpa //tftpd-hpa配置
2)/home/chunn/linux/tftp文件夹下打算好imx6ull-alientek-emmc.dtb设备树、zImage内核镜像;/home/chunn/linux/nfs文件夹下打算好rootfs根文件系统
3)设置uboot的IP环境变量:
setenv ethaddr 00:04:9f:04:d2:35 //硬件地址
setenv gatewayip 192.168.1.1 //网关
setenv ipaddr 192.168.1.103 //开发板的IP地址
setenv netmask 255.255.255.0 //子网掩码
setenv serverip 192.168.1.102 //Ubuntu的IP地址(可以通过ifconfig查询)
saveenv //保存环境变量
4)设置uboot的bootcmd和bootargs环境变量:
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.0.102:/home/chunn/linux/nfs/rootfs ip=192.168.0.103:192.168.0.102:192.168.0.1:255.255.255.0::eth0:off'
saveenv
最后总算步入熟悉的根文件系统:
Linux系统&驱动其它文章: