现在2015.04版uboot已经真正可以为我们的E9服务了,接下来就是移植内核,其实自3.x以后的新版内核移植起来已经相当省心省力了,主要就是修改dts文件,方便起见,我们还是先把tftp、nfs的pc端和板子都配好,方便我们使用网络启动调试。
1.uboot环境变量设置:
TQE9>> setenv mynetargs'setenv bootargs console=${console},${baudrate} ${smp} root=/dev/nfs ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp'
TQE9>> setenv bootcmd_net 'run mynetargs;tftpboot ${loadaddr} ${bootfile};tftpboot ${fdt_addr} ${fdt_file};bootz ${loadaddr} - ${fdt_addr};'
TQE9>> setenv bootcmd 'run bootcmd_net'
TQE9>>saveenv
2.在pc(ubuntu)上安装设置tftp服务:
1. 安装
$ sudo apt-get install tftp-hpa tftpd-hpa
2. 建立目录
$ mkdir /opt/tftpboot
$ sudo chmod 0777 /opt/tftpboot
$ echo “this is a test tftp file” > /opt/tftpboot/test.txt
$ echo “this is another test tftp file” > ./test1.txt
3. 配置
$ sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/opt/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s" # 这里是选项,-c是可以上传文件的参数,-s是指定tftpd-hpa服务目录,上面已经指定
4. 重启服务
$ sudo service tftpd-hpa restart
5. 测试
$ tftp 127.0.0.1
tftp>get test.txt
tftp>put test1.txt
tftp>q
miiphy_init():初始化mii_devs链表,该列表中是一系列象征mac控制器,每个miid_dev表示一条mdio总线,可挂载多个phy设备。
phy_init():根据宏定义(例如CONFIG_PHY_REALTEK、CONFIG_PHY_ATHEROS等)初始化相应一个或多个系列网卡,其中就有我们项目中使用的realtek(RTL8211E)系列网卡以及sabresd公版所使用的aheros(AR8031)系列网卡。
phy_env_init():初始化关于phy的一些uboot环境变量,这里我们不需要关心。
board_eth_init():网卡的板级初始化。
3.在pc(ubuntu)上安装设置nfs服务:
1. 安装
$ sudo apt-get install nfs-kernel-server
$ mkdir /opt/nfsroot
2.配置nfs;
$ sudo vi /etc/exports
在文文件的最后一行添加:
/opt/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
3.重启服务
$ sudo service nfs-kernel-server restart
4.挂载测试指令:
$ sudo mount -t nfs 127.0.0.1:/opt/nfsroot / ./mydir
4.准备kernel:
在Kernel上要做的事情不多,总的来说也就是配置dts和make menuconfig配置内核。
1.准备kernel
$ cd /opt/fsl-yocto-L4.1.15_1.0.0-ga/fsl-release-bsp/
$ source fsl-setup-release.sh -b build-x11
$ bitbake core-image-minimal
$cp tmp/work/imx6qsabresd-poky-linux-gnueabi/linux-imx/4.1.15-r0/Git/* /opt/fsl-yocto-L4.1.15_1.0.0-ga/limux-4.1.14-e0/ -rfd
$cd /opt/fsl-yocto-L4.1.15_1.0.0-ga/limux-4.1.14-e0/
$cp arch/arm/boot/dts/imx6q-sabresd.dts arch/arm/boot/dts/imx6q-tqe9.dts
$cp arch/arm/boot/dts/imx6qdl-sabresd.dtsi arch/arm/boot/dts/imx6qdl-tqe9.dtsi
$vim arch/arm/boot/dts/imx6q-tqe9.dts
把
#include “imx6qdl-sabresd.dtsi”
改成
#include “imx6qdl-tqe9.dtsi”
2.修改imx6q-tqe9.dts以适应板子上的串口终端管脚:
把pinctrl_uart1节点改成如下:
pinctrl_uart1:uart1grp {
fsl,pins = <
MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA0x1b0b1
MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA0x1b0b1
>;
};
把pinctrl_usdhc3节点改成如下:
pinctrl_usdhc3: usdhc3grp {
fsl,pins = <
MX6QDL_PAD_SD3_CMD__SD3_CMD0x17059
MX6QDL_PAD_SD3_CLK__SD3_CLK0x17059
MX6QDL_PAD_SD3_DAT0__SD3_DAT00x17059
MX6QDL_PAD_SD3_DAT1__SD3_DAT10x17059
MX6QDL_PAD_SD3_DAT2__SD3_DAT20x17059
MX6QDL_PAD_SD3_DAT3__SD3_DAT30x17059
#if 0
MX6QDL_PAD_SD3_DAT4__SD3_DAT40x17059
MX6QDL_PAD_SD3_DAT5__SD3_DAT50x17059
MX6QDL_PAD_SD3_DAT6__SD3_DAT60x17059
MX6QDL_PAD_SD3_DAT7__SD3_DAT70x17059
#endif
>
};
在pmic节点添加status = “disabled”属性(E9没有pfuze100芯片)
pmic:pfuze100@08 {
compatible = “fsl,pfuze100”;
reg = <0x08>’
status = “disabled”;
...
}
3.配置内核
$ make distclean
官方sabresd的yocto采用的就是KERNEL-DIR/arch/arm/configs/imx_v7_defconfig,这里我们也使用这个配置方案。
$ make imx_v7_defconfig
配置交叉编译工具链
$ make menuconfig
Gerneral setup --->
Cross-compile tool prefix
(/opt/fsl-imx-x11/4.1.15-1.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-)
配置RTL8211E网卡驱动
Device Drivers --->
Network device support --->
PHY Device support and infrastructure --->
<*>Drivers for Realtek PHYs
$ make
$ cp arch/arm/boot/zImage arch/arm/boot/dts/imx6q-tqe9.dtb /opt/tftpboot/
取消掉ATH6KL_SDIO、BCMDHD_SDIO、BCMDHD、BRCMFMAC的驱动选择。
5.准备nfs文件系统
把ycoto中编出来的文件系统直接解压到/opt/nfsroot/下
$ cp /opt/fsl-yocto-L4.1.15_1.0.0-ga/fsl-release-bsp/build-x11/tmp/deploy/images/imx6qsabresd/fsl-image-qt5-imx6qsabresd-20160428090146.rootfs.tar.bz2 /opt/nfsroot/
$ cd /opt/nfsroot/
$ tar jxvf fsl-image-qt5-imx6qsabresd-20160428090146.rootfs.tar.bz2
$ rm fsl-image-qt5-imx6qsabresd-20160428090146.rootfs.tar.bz2
6.板子pc连同一局域网,上电启动板子。
现在板子应该已经可以进入linux系统了, mmc就不烧了。
注意:
如果启动期间串口终端出现如下错误:
fec 2188000.ethernet eth0: no PHY, assuming direct connection to switch
libphy: PHY fixed-0:00 not found
fec 2188000.ethernet eth0: could not attach to PHY
IP-Config: Failed to open eth0
IP-Config: No network devices available
则在kernel源码目录进行如下操作:
$ vi drivers/net/phy/phy_device.c +296 作如下修改:
292 static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id,
293 bool is_c45, struct phy_c45_device_ids *c45_ids)
294 {
295 int phy_reg;
296 msleep(1);
297 if (is_c45)
298 return get_phy_c45_ids(bus, addr, phy_id, c45_ids);
299
300 /* Grab the bits from PHYIR1, and put them in the upper half */
301 phy_reg = mdiobus_read(bus, addr, MII_PHYSID1);
302 if (phy_reg < 0)
303 return -EIO;
重新编译内核并把镜像拷到/opt/tftpboot/下即可,原因是有可能phy芯片的mdio操作过快致使读不出来phy_id从而不能识别phy,这种情况可能是我的板子idea个性问题也可能是该RTL8211E芯片的共性问题,由于手上只有一块板子无从验证。