【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
前面我们陆陆续续开发了差不多有10个驱动,涉及到网口、串口、音频和视频等几个方面。但是整个开发的效率还是比较低的。每次开发调试的时候都很麻烦,譬如说,如果是驱动代码的问题,就需要把sd卡拆下来,重新烧入;再比如说,uboot和linux之间不能连续运行,需要手动做一些配置之后,再启动linux kernel;还比如说,使用480*272的dtb文件之后,之前的网卡功能都丢失了,很不方便。所以针对这些问题,我们想办法集中处理一下,这样有利于后期的复杂驱动调试、以及上层软件开发。
1、解决uboot不能正常启动linux kernel的问题
要解决这个问题,关键在于增加CONFIG_BOOTCOMMAND和CONFIG_BOOTARGS这两个宏。因为我们使用的是v3s这颗芯片,所以在uboot上面,可以把上述两个宏添加到include/configs/sun8i.h这个文件下面,
#include <configs/sunxi-common.h>
#ifdef CONFIG_BOOTCOMMAND
#undef CONFIG_BOOTCOMMAND
#endif
#define CONFIG_BOOTCOMMAND "setenv bootm_boot_mode sec; "\
"load mmc 0:1 0x41000000 zImage;" \
"load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-with-480x272-lcd.dtb;" \
"bootz 0x41000000 - 0x41800000;"
#ifdef CONFIG_BOOTARGS
#undef CONFIG_BOOTARGS
#endif
#define CONFIG_BOOTARGS "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0"
注意两个宏的设置都放在include头文件之后。当然因为这个文件发生了修改,那么整个uboot就需要重新编译一下,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
等编译结束,生成了我们需要的bin文件之后,就可以pc上插入读卡器,准备bin文件烧入了,
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/u-boot-3s-current$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
[sudo] password for feixiaoxing:
389+1 records in
389+1 records out
398367 bytes (398 kB, 389 KiB) copied, 1.71158 s, 233 kB/s
烧入的工具是利用ubuntu虚拟机里面的dd命令来完成的。为了保证烧入ok,可以继续输入一个sync命令。结束后,退出sd卡,重新把micro sd卡插入到开发板上,不出意外的话,就可以看到uboot、kernel连续启动的过程了,
如果你已经可以看到这样的内容,代表当前uboot可以持续启动linux kernel了。
2、解决开机后需要输入root用户名的问题
如果当前还处于开发阶段,每次都需要输入root用户名,其实是很令人反感的一个事情。虽然是免密登录,但是还是想着可以更方便一点。这个时候,完全可以通过文件配置的方法来解决这一问题。
# Put a getty on the serial port
#console::respawn:/sbin/getty -L console 0 vt100# GENERIC_SERIAL
ttyS0::once:/bin/login root
在原来/etc/inittab里面注释掉getty的内容,添加login这一行,那么我们每次开机的时候就不需要手动输入root这个用户了。并且,开机之后,自动切换到/root这个目录下面。
3、添加开机启动脚本的问题
有一些程序或者配置,我们其实是希望系统启动后可以默认执行的,比如这个时候就希望linux可以自动帮我们执行一些脚本,例如auto.sh。要实现这个目标,这个时候,可以这么做,分成三步。
第一步,在/etc/init.d/rcS最后一行添加这么一句,
/etc/rc.local
第二步,创建/etc/rc.local文件,填充下面这些内容,同时chmod +x /etc/rc.local,
#!/bin/sh
/root/auto.sh &
第三步,创建/root/auto.sh文件,添加一点测试内容,比如
echo "hello, world"
同样auto.sh需要chmod +x auto.sh设置一下,让它变成可执行文件。为了测试我们的配置有没有效果,可以按下板子上的复位键,如果看到这些输出,大体可以认为我们的设计是ok的。
仔细找一下,还是发现了hello, world的身影。这说明我们的配置是正确的。
4、添加网卡
观察发现,sun8i-v3s-licheepi-zero-with-480x272-lcd.dts和sun8i-v3s-licheepi-zero-with-lcd.dtsi这两个文件中,都没有关于以太网的配置。而之前sun8i-v3s-licheepi-zero-dock.dts中则包含了相关的内容,这个时候我们要做的,就是把dsun8i-v3s-licheepi-zero-dock.dts中关于网卡的配置挪到sun8i-v3s-licheepi-zero-with-lcd.dtsi当中去就可以了,
aliases {
ethernet0 = &emac;
};
首先是ethernet0指向了emac,
&emac {
status = "okay";
};
其实是emac中的status设置为okay。别看这两步很简单,但是如果不做的话,网卡就是启动不起来。当然有了这两点还是不够的,我们需要在/etc/network/interfaces中增加一点配置,
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.230
netmask 255.255.255.0
gateway 192.168.0.1
dns-nameservers 8.8.8.8
从脚本上看,系统启动后除了配置loopback之外,还需要添加eth0,并且需要进一步设置ip、netmask和gateway。这一顿操作之后,如果pc电脑还在同一网段,基本就可以和电脑之间实现ping的正常通讯了。
# ifconfig
eth0 Link encap:Ethernet HWaddr 02:00:A4:52:F3:CC
inet addr:192.168.0.230 Bcast:0.0.0.0 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:384 errors:0 dropped:0 overruns:0 frame:0
TX packets:162 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:33241 (32.4 KiB) TX bytes:7140 (6.9 KiB)
Interrupt:36
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
# ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100): 56 data bytes
64 bytes from 192.168.0.100: seq=0 ttl=128 time=92.529 ms
64 bytes from 192.168.0.100: seq=1 ttl=128 time=12.744 ms
64 bytes from 192.168.0.100: seq=2 ttl=128 time=38.267 ms
64 bytes from 192.168.0.100: seq=3 ttl=128 time=60.146 ms
64 bytes from 192.168.0.100: seq=4 ttl=128 time=84.125 ms
64 bytes from 192.168.0.100: seq=5 ttl=128 time=80.020 ms
^C
--- 192.168.0.100 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 12.744/61.305/92.529 ms