{//===============================开发环境搭建=================================== 约定: “$”表示是在主机上执行,“#”表示在目标板执行
{//探讨 JACK: Hi,ivan, 嵌入式开发环境如何搭建啊,完全不知道如何下手啊? IVAN: 网络搜索 /* 注: 如何搜索关键字,快速找到需要信息。是项目开发中重要的一种能力。 如下 “ubuntu 嵌入式 开发环境 搭建 ” 注意关键字要简明,且用空格隔开,方便搜索引擎查找 */ JACK: TFTP服务不行啊,怎么办? IVAN: 网络搜索 //“ubuntu tftp服务 安装”或 “嵌入式 tftp服务 安装”或“linux tftp服务 安装”
JACK: NFS服务不行啊,怎么办? IVAN: 网络搜索 // “ubuntu NFS服务 安装” }
{//开发主机安装 {//虚拟机安装(已有则跳过) 解压Ubuntu_12.04_64-bit_farsight.7z /*该镜像是在官方Ubuntu 12.04 LTS 64bit 基础上,安装了编译调试bootloader 内核,android 4.4源码所需的工具和库。 如交叉编译工具,VIM ,TFTP,NFS等 */ 点VMware-workstation-full-10.0.4-2249910.exe //按默认方式安装虚拟机 安装好后,选择“打开虚拟机”导入已安装好的镜像 Ubuntu_12.04_64-bit_farsight.vmx 点播放虚拟机,选我已移动该虚拟机 启动后,用户名是linux 密码是1 } {//linux和window间共享 虚拟机 -> 设置 -> 选项 -> 共享文件夹 -> 添加 -> 选择需要共享的位置(如E盘) $ ls /mnt/hgfs/E/ //有共享的内容显示,表示成功 $ cd ~ $ ln -s /mnt/hgfs/E/ e //创建软连接, 方便操作 } {//交叉编译工具安装 $ tar xvf gcc-4.6.4.tar.xz $ sudo vim /etc/bash.bashrc /* 添加交叉编译工具链的路径到系统脚本 在末尾添加 export PATH=/home/linux/store/gcc-4.6.4/bin:$PATH 注意路径要根据gcc-4.6.4的实际路径修改 */ $ source /etc/bash.bashrc //使配置文件生效 $ arm-n 然后按Tab键补全 //如果能补全为arm-none-linux-gnueabi- 表示安装交叉编译工具成功了 } {//u-boot编译(用已移植好的) $ cp ~/e/fs4412/2系统移植/1实验/2第二天_U-boot移植/u-boot-2013.01-fs4412.tar.xz . $ tar -xvf u-boot-2013.01-fs4412.tar.xz $ cd u-boot-2013.01-fs4412 $ ./build.sh //运行该脚本后会自动生成最终的镜像 u-boot-fs4412.bin $ cp u-boot-fs4412.bin ~/e/USB_fastboot_tool/platform-tools/ //通过后面的fastboot方式可写到板子上 }
{//内核编译(用已移植好的) //配置编译关系 kconfig -> make menuconfig -> .config ->make -> makefile ->zImage $ cp ~/e/fs4412/2系统移植/1实验/3第三天_内核移植/linux-3.14-fs4412.tar.xz . $ tar -xvf linux-3.14-fs4412.tar.xz $ cd linux-3.14-fs4412 $ make uImage //编译生成适合u-boot bootm启动的内核镜像 uImage $ make dtbs /*编译设备树 make meunconfig //图像界面进行配置(如 指定新的驱动,内核裁剪) make modules //只编译模块文件(.ko文件) make //编译所有 (但不包括uImage生成) */ $ cp arch/arm/boot/uImage /tftpboot/ $ cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/ } {//tftp服务安装 //----虚拟机上安装tftp服务 $ sudo dpkg -s tftpd-hpa //检查是否安装tftp server $ sudo apt-get install tftpd-hpa //如果未安装,安装 tftp-server $ sudo vi /etc/default/tftpd-hpa //修改tftp服务器配置文件为 TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-c -s -l" $ mkdir /tftpboot //创建tftpboot目录, $ sudo chmod a+w /tftpboot $ sudo service tftpd-hpa restart //启动 tftp-server //-----验证虚拟机tftp服务是否OK $ sudo cat /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/tftpboot" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="-l -c -s" $ sudo service tftpd-hpa restart //如果有更改配置,需要重启一下 tftp-server $ cd /tftpboot $ touch test $ cd /tmp $ tftp 127.0.0.1 tftp>get test tftp>q $ ls //看到有test文件,表示该tftp服务是OK的 //---准备待传输文件 拷贝 第一天_环境搭建里面里的 u-boot-fs4412.bin uImage exynos4412-fs4412.dtb 到 /tftpboot 目录下 } {//nfs服务安装 $ service nfs-kernel-server /*检查nfs服务是否安装 如果显示下面信息, 表示有安装 * Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart} 如果没有,需安装 #sudo apt-get install nfs-kernel-server */ $ sudo vi /etc/exports /*修改配置文件,指定共享目录位置 在末尾追加 /nfs/rootfs *(rw,sync,no_root_squash) 或 /source/ *(rw,sync,no_subtree_check) */ $ sudo mkdir /nfs $ sudo chmod 777 /nfs $ cd /nfs $ 拷贝 1第一天_环境搭建 下的 rootfs.tar.xz 到 /nfs 目录下 //rootfs.tar.xz是已制作好的根文件系统 $ tar -xvf rootfs.tar.xz $ sudo chmod 777 rootfs $ sudo /etc/init.d/nfs-kernel-server restart //重启nfs服务(使得前面修改生效) $ sudo mount -t nfs localhost:/nfs/rootfs/ /mnt/ //测试nfs服务是否安装成功。 $ ls /mnt/ /*如果其中的内容和/nfs/rootfs中一致。 表示有挂载成功 如显示下面内容,表示成功 bin dev etc lib linuxrc mnt proc root sbin sys tmp usr var */ $ sudo umount /mnt } } {//目标机安装(u-boot烧写调试) -- 需要SD卡 {//制作SD卡,并从SD卡启动 (使用的是2010版本u-boot,支持fastboot烧写的) 将sdfuse_q 拷贝到Linux下 将SD卡插入电脑并识别 进入sdfuse_q执行如下操作 $ sudo ./mkuboot.sh /dev/sdb /*出现下面的信息,表示SD启动盘制作成功 Fuse FS4412 trustzone uboot file into SD card /dev/sdb reader is identified. u-boot-fs4412.bin fusing... 1029+1 records in 1029+1 records out 527104 bytes (527 kB) copied, 5.31834 s, 99.1 kB/s u-boot-fs4412.bin image has been fused successfully. Eject SD card */ 关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式) 刚才做好的SD启动盘插入SD卡插槽 打开电源 } {//---fastboot烧写 连接USB线到板子上的USB OTG口 连接串口线到板子的COM2口 重启板子,并快速停下,在串口终端输入下面命令 /* 如果有有需要,可以格式化 eMMC 并创建分区 $ fdisk -c 0 $ fatformat mmc 0:1 $ ext3format mmc 0:2 $ ext3format mmc 0:3 $ ext3format mmc 0:4 */ $ reset 重启切换到2010版的sd卡启动 $ fastboot //会提示装驱动,选中第一天_环境搭建里的fastboot_driver 安装 打开dos终端 进入USB_fastboot_tool\platform-tools目录输入 > fastboot.exe flash bootloader u-boot-fs4412.bin /* 同理可以烧录其它镜像 > fastboot.exe flash kernel zImage > fastboot.exe flash ramdisk ramdisk-uboot.img > fastboot.exe flash system system.img > fastboot -w */ 关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源 从flash 的u-boot启动 /* 如果启动失败,可以通过拨号开关恢复到SD卡方式启动 如果启动成功,想恢复到原来的u-boot启动 (第一次输入reset后会自动切换回去,不用拔拨号开关) */ } } {//1. 板子串口能显示信息 连接串口线到板子的COM2口 //如果是用笔记本电脑的,需装usb转串口驱动(用360驱动大师在线装方便) 确认拨号开关SW1 为0110 (从EMMC(FLASH的一种) 启动) {//? 无串口打印信息 波特率设置不对, 流控未选为无 电脑用的可能是COM2 u-boot被破坏了,切换到SD卡启动(SW1 改为1000) } }
{//2. 板子能ping通虚拟机 (要关闭防火墙 网卡右键高级) ------------------------ |板子 192.168.9.9 | ------------------------ | ------------------------ |电脑 192.168.9.222 | //做中转用,和板子虚拟机IP要在同一网段, 且不能和它们IP一样 ------------------------ | ------------------------ |虚拟机 192.168.9.120 | ------------------------ //---------确认板子和电脑是能通信的 设置电脑网卡ip 为192.168.9.222 255.255.255.0 192.168.9.1 启动板子,快速按任意键停在boot处,设置u-boot 的环境变量 # setenv serverip 192.168.9.120 //注意它与虚拟机里 ubuntu 的ip要一致 # setenv ipaddr 192.168.9.9 # setenv gatewayip 192.168.9.1 # pri /*查看设置后效果 FS4412 # pri baudrate=115200 bootargs=root=/dev/nfs nfsroot=192.168.9.120:/nfs/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.9 bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000 bootdelay=3 ethact=dm9000 ethaddr=11:22:33:44:55:66 gatewayip=192.168.9.1 ipaddr=192.168.9.9 netmask=255.255.255.0 serverip=192.168.9.120 */ # ping 192.168.9.222 //测试网络是否连通 ,注意在u-boot中, 它能ping电脑, 电脑不能ping它 //注意,要拔掉jtag线,否则ping 会重启 host 192.168.9.222 is alive //is alive 表示ok # saveenv 保存设置 //---------确认电脑和虚拟机时能通信 编辑 -> 虚拟网络编辑器 -> VMnet0 桥接到(选连板子的网卡) //注意不要用automic,应手动指定对应的网卡 虚拟机 -> 设置 -> 网卡适配器 -> 自定义 (选 VMnet0) /*使虚拟机内的虚拟网卡,关联到电脑实际用到的网卡 通过选VMnet0 和 VMnet1 。实现连板子,还是上internet的切换 */ 点ubuntu右上角网络图标 -> 右键选编辑连接 -> 全删掉 -> 添加(改新连接名称为board) -> IPV4 设置 -> 方法(选手动) -> 点添加 设置为 192.168.9.120 255.255.255.0 192.168.9.1 并保存退出 点右上角网络图标,先断开,再选board连接 // 通过选board,和internet 实现连板子,还是上internet的切换 $ ifconfig //看ip是否已变为了192.168.9.120 $ ping 192.168.9.222 //测试电脑和虚拟机是否联通 (如不通,可尝试修复一下网卡,重启虚拟机) //---------确认板子能和虚拟机能通讯 $ reset 重启boot $ ping 192.168.9.120 //注意: boot阶段是板子能ping 电脑 ,电脑不能ping板子 host 192.168.9.120 is alive //通讯OK ,失败会显示not alive }
{//3. 网络自动 tftp 加载内核,并挂载nfs rootfs 启动 # setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000 /* 设置tftp方式加载内核 setenv bootcmd 设置环境变量(自启动命令 bootcmd) tftp 41000000 uImage\; 通过tftp从虚拟机/tftpboot目录下下载内核uImage到板子的内存 41000000 处。 \; 用于分割多个命令 tftp 42000000 exynos4412-fs4412.dtb 通过tftp下载设备树文件 exynos4412-fs4412.dtb 到板子的内存 42000000 处 bootm 41000000 - 42000000 启动内核(41000000处放的是内核uImage, 42000000处放的是设备树文件) */ # setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.9 /* 挂载nfs rootfs setenv bootarg 设置环境变量( bootarg是启动参数) root=/dev/nfs 指定根文件系统类型是 nfs nfsroot=192.168.9.120:/source/rootfs 指定source rootfs的位置 (是在ip 是192.168.9.120的机器上 ,的/source/rootfs目录下). 注意/nfs/rootfs必须和前面NFS服务配置文件设置一致 */ # savenenv //保存环境变量
掉电重启动板子 /* 看能否挂载nfs rootfs成功 能看到下面信息表示成功 [root@farsight ]# ls etc linuxrc proc sbin tmp var bin dev lib mnt root sys usr 在里面创建文件,电脑的/nfs/rootfs上同步变化 */ } }