Linux驱动:基本环境准备
开发板调试模块
准备内核源码树
进行编译
make
查看信息
modifo module_test.ko
启动开发板的zImage
Windows使用USB接口,使用工具dnw刷机,写入的是uboot.bin文件,写到非易失性存储设备中,如 NAND 闪存、eMMC 等
Windows还可以使用工具x210_Fusing_Tool将uboot.bint写入SD卡
Linux可以使用dd命令(sb_fush.sh)将uboot.bin写入SD卡
当uboot启动后可以使用fastboot烧录镜像、tftp传输镜像、nfs挂载镜像
可以参考ARM裸机:刷系统
前提是开发板的Uboot先跑起来
查看ubuntu内核源码树目录
uname -r
调整模块配置代码,修改为自己编译的内核源码目录
ls:查看目录
make:编译
modinfo module_test.ko:查看编译后的模块信息
设备uboot起来后查看环境变量
ptint
配置IP信息
set garewayip 192.168.31.1
set serverip 192.168.31.70
set ipaddr 192.168.31.88
save
记得保存!!!
查看Ubuntu上的tftp看这个tftp使用
设置bootcmd使开发板通过tftp下载自己建立的内核源码树编译得到的zImage
就是配置一句,很简单
set bootcmd 'tftp 0x30008000 zImage;bootm 0x30008000'
将ZImage放到ubuntu的tftp目录下
写自己的目录,自己编译源代码目录下的目录里面找
cp /home/aston/workspace/driver/kernel/arch/arm/boot/zImage ./
重启开发板
reset
内核和自己编译的匹配
设置bootargs使开发板从nfs去挂载rootfs(内核配置记得打开使能nfs形式的rootfs)
支持看这里,如果不支持,下面有方法介绍
查看ubuntu的nfs目录是否可以使用,看这个linux 配置nfs
查看nfs目录
showmount localhost -e
设置bootargs
setenv bootargs root=/dev/nfs nfsroot=192.168.31.70:/home/aston/workspace/nfsdir ip=192.168.31.88:192.168.31.70:192.168.31.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
Ubuntu和开发板网络连接
连接方式:通过网线将开发板和电脑连接
Ubuntu进入root超级用户模
su
配置
gedit /etc/network/interfaces
auto eth33
iface eth33 inet staticaddress 192.168.31.70netmask 255.255.255.0gateway 192.168.31.1dns-nameservers 8.8.8.8 8.8.4.4
设置虚拟机联网方式为桥接模式,并选择有线网卡。
重启网卡或者直接重启虚拟机
sudo /etc/init.d/networking restart
查看虚拟机的IP
ifconfig
ping 192.168.31.88
内核配置记得打开使能nfs形式的rootfs
make menuconfig
make[1]: *** [/home/aston/workspace/driver/kernel/scripts/kconfig/Makefile:208: scripts/kconfig/dochecklxdialog] Error 1 make: *** [Makefile:463: menuconfig] Error 2 root@ubuntu:/home/aston/workspace/driver/kernel# root@ubuntu:/home/aston/workspace/driver/kernel# make menuconfig *** Unable to find the ncurses libraries or the *** required header files. *** ‘make menuconfig’ requires the ncurses libraries. *** *** Install ncurses (ncurses-devel) and try again. *** make[1]: *** [/home/aston/workspace/driver/kernel/scripts/kconfig/Makefile:208: scripts/kconfig/dochecklxdialog] Error 1 make: *** [Makefile:463: menuconfig] Error 2
解决办法:安装ncurses库
sudo apt-get install build-essential
sudo apt-get install libncursesw5-dev
sudo apt-get install ncurses
sudo apt-get install libncurses5-dev
注意网络连接!!!
再次执行
make menuconfig
1、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项
Networking support Networking options TCP/IP networkingIP: kernel level autoconfiguration[*] IP: DHCP support[*] IP: BOOTP support2、配置开启nfs服务
File systems ---> Network File Systems ---><*> NFS client support [*] NFS client support for NFS version 3 [*] NFS client support for the NFSv3 ACL protocol extension [*] NFS client support for NFS version 4 (EXPERIMENTAL) [*] NFS client support for NFSv4.1 (DEVELOPER ONLY) [*] Root file system on NFS
按照顺序操作,不然最后一个没有!!!
重新make编译,将ZImage放到ubuntu的tftp目录下
出行错误:
[ 75.682718] Root-NFS: Unable to get mountd port number from server, using default
[ 75.690345] Root-NFS: Server returned error -101 while mounting /home/aston/workspace/nfsdir
[ 75.698592] VFS: Unable to mount root fs via NFS, trying floppy.
[ 75.704807] VFS: Cannot open root device "nfs" or unknown-block(2,0)
使用fastboot试试
参考这个ARM裸机:刷系统
在cmd下使用以下三个命令来完成烧录
fastboot flash bootloader u-boot.bin 烧uboot
fastboot flash kernel zImage 烧linux kernel
fastboot flash system rootfs_qt4.ext3 烧rootrs
要确认uboot环境变量
set bootcmd 'movi read kernel 30008000; bootm 30008000'
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
用户名:root
密码:123456
再次尝试挂载nfs
查看开发板IP
ifconfig
确定网络连接成功,填写自己nfs服务器的IP
ping 192.168.31.70
mkdir /mnt/nfs # 创建挂载点
mount -v -t nfs 192.168.x.x:/home/aa/workspace/nfsdir /mnt/nfs # 替换为NFS服务器的IP地址和共享目录出现错误:```csharp
svc: failed to register lockdv1 RPC service (errno 111)
修改挂载语句:
mount -v -t nfs -o nolock 192.168.31.70:/home/aston/workspace/nfsdir /mnt
取消挂载
```csharp
umount /mnt/nfs
那现在将inand里面的内容进行破坏,重新按照前面的内容进行操作,检测是否是挂载语句的问题导致失败的
busybox dd if=/dev/zero of=/dev/mmcblk0 bs=512 seek=1 count=1 conv=sync
不插入SD卡,看到的提示
修改bootargs
setenv bootargs root=/dev/nfs nfsroot=192.168.31.70:/home/aston/workspace/nfsdir,nolock ip=192.168.31.88:192.168.31.70:192.168.31.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
重启设备,还是错误,后面解决吧
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
先试用fastboot将自己编译内核放入设备当中,先调试起来
实验测试
挂载目录
mount -v -t nfs -o nolock 192.168.31.70:/home/aston/workspace/nfsdir /mnt
装载成功
使用dmesg 可以看到打印日志信息
复习打印级别
查看日志级别的设置
cat /proc/sys/kernel/printk
修改控制台日志级别
echo 5 > /proc/sys/kernel/printk
示例分析:7 4 1 7
控制台日志级别(第 1 个数字 7)
表示内核会将 级别 ≤ 7 的日志消息输出到控制台。由于 7 是最高级别(包含所有级别),因此 所有日志都会输出到控制台。
默认消息日志级别(第 2 个数字 4)
内核模块加载时若未指定日志级别,默认使用级别 4(KERN_WARNING),即只记录 警告及更严重的日志(级别 ≤ 4)。
最低控制台日志级别(第 3 个数字 1)
控制台日志级别的最小值为 1,意味着用户无法将控制台级别设置为 0(避免完全屏蔽紧急日志)。
默认控制台日志级别(第 4 个数字 7)
系统启动时,控制台日志级别初始化为 7,即默认输出所有日志。
若需永久生效,需修改内核配置文件(如 /etc/sysctl.conf),添加或修改以下行:
kernel.printk = 7 4 1 7 # 格式:四个数字用空格分隔
修改后执行 sysctl -p 使配置生效。
我将第一个数字修改为5 ,所有小于5的级别的日志都打印了。
先准备好环境,才能进程后面的内容,最最主要的就是需要自己拥有源代码的内核!!!
参考
https://blog.csdn.net/masudong/article/details/105077861
https://blog.csdn.net/yihui8/article/details/43702603