1、实验一交叉工具链的安装【实验目的】了解交叉工具链的编译过程及其使用。说明:在实验中命令行提示符为“$”表示在主机上运行,“#”表示在目标板上运行【实验环境】1、ubuntu 12.04发行版2、FS4412平台【实验步骤】1、如果要自己编译工具链,从以下链接下载源码crosstools-ng下载地址http:/ymorin.is-a-geek.org/download/crosstool-ng/同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是http:/ymorin.is-a-geek.org/download/crosstool-ng/01-fixes/2、解压工具
2、链压缩包$ cd $ mkdir toolchain$ cd toolchain将第一天/工具/gcc-4.6.4.tar.xz拷贝到toolchain目录下并解压$ tar xvf gcc-4.6.4.tar.xz3、环境变量的添加修改文件/etc/bash.bashrc添加如下内容export PATH=$PATH:/home/linux/toolchain/gcc-4.6.4/bin重启配置文件$ source /etc/bash.bashrc4、工具链的测试$ arm-none-linux-gnueabi-gcc vUsing built-in specs.COLLECT_GCC=ar
3、m-none-linux-gnueabi-gccCOLLECT_LTO_WRAPPER=/home/david/Exynos4412/toolchain/gcc-4.6.4/bin/libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapperTarget: arm-arm1176jzfssf-linux-gnueabiConfigured with: /work/builddir/src/gcc-4.6.4/configure -build=i686-build_pc-linux-gnu-host=i686-build_pc-lin
4、ux-gnu -target=arm-arm1176jzfssf-linux-gnueabi-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4-with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot -enable-languages=c,c+ -with-arch=armv6zk-with-cpu=ar
5、m1176jzf-s -with-tune=arm1176jzf-s -with-fpu=vfp -with-float=softfp-with-pkgversion=crosstool-NG hg+default-2685dfa9de14 - tc0002 -disable-sjlj-exceptions-enable-_cxa_atexit -disable-libmudflap -disable-libgomp -disable-libssp-disable-libquadmath -disable-libquadmath-support-with-gmp=/work/builddir/
6、arm-arm1176jzfssf-linux-gnueabi/buildtools-with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools-with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools-with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools-with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnuea
7、bi/buildtools-with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools-with-host-libstdcxx=-static-libgcc -Wl,-Bstatic,-lstdc+,-Bdynamic -lm -enable-threads=posix-enable-target-optspace -without-long-double-128 -disable-nls -disable-multilib-with-local-prefix=/opt/TuxamitoSoftToolchains
8、/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot -enable-c99 -enable-long-longThread model: posixgcc version 4.6.4 (crosstool-NG hg+default-2685dfa9de14 - tc0002)这样我们的交叉工具链就安装好了实验二 u-boot的烧写及使用【实验目的】了解u-boot的常用命令和linux内核的引导。【实验环境】1、ubuntu 12.04发行版2、u-boot-2013.033、F
9、S4412平台4、交叉编译器arm-none-linux-gnueabi-gcc【实验步骤】1、SD启动盘制作a) 将第一天/工具/sdfuse_q拷贝到Linux下b) 将SD卡插入电脑并识别c) 进入sdfuse_q执行如下操作$ sudo ./mkuboot.sh /dev/sdbd) 在SD卡中创建目录sdupdate并把第一天/镜像中的u-boot-fs4412.bin拷贝到这个目录下2、u-boot的烧写a) 连接串口和板子,运行串口通信程序(putty第一天工具中)选择右上角的”Serial”,然后点击左下角的”Serial”按照自己的主机的情况选择COM口其他必须一直,然后点击
10、open打开串口b) 关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)后打开电源c) 将刚才做好的SD启动盘插入SD卡插槽d) 重新打开开发板能够看到如下界面在倒计时时按任意键e) 烧写在终端上执行sdfuse flashall等待终端无输出是表示烧写结束f) 关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源可以看到如下界面表示烧写成功在倒计时时按任意键3、通过网络加载内核和文件系统a) 将第一天/镜像文件/uImage拷贝到ubuntu的 /tftpboot下b) 将第一天/镜像文件/rootfs.tar.xz拷贝到ubuntu的 /source下并
11、解压c) 将第一天/镜像文件/exynos4412-fs4412.dtb拷贝到ubuntu的 /tftpboot下d) 修改虚拟机nfs配置文件/etc/exports,添加如下内容并重启nfs服务/source/rootfs *(rw,sync,no_subtree_check,no_root_squash)e) 重新驱动nfs服务$ sudo /etc/init.d/nfs-kernel-server restartf) 设置启动参数#setenv serverip 192.168.9.120#setenv ipaddr 192.168.9.233#setenv bootcmd tftp
12、41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000- 42000000#setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rwconsole=ttySAC2,115200 init=/linuxrc ip=192.168.9.233# saveenv注意:192.168.9.120 对应Ubuntu的ip192.168.9.233 对应板子的ip这两个ip应该根据自己的实际情况适当修改g) 启动开发板看到如下现象表示成功通过网络挂
13、载:这是可以输入一些Linux的命令测试4、从EMMC加载内核和文件系统a) 拷贝第一天/镜像文件/ramdisk.img拷贝到虚拟机/tftpboot目录下b) 烧写内核镜像到EMMC上# tftp 41000000 uImage# movi write kernel 41000000c) 烧写设备树文件到EMMC上# tftp 41000000 exynos4412-fs4412.dtb# movi write dtb 41000000d) 烧写文件系统镜像到EMMC上# tftp 41000000 ramdisk.img# movi write rootfs 41000000 30000
14、0e) 设置启动参数# setenv bootcmd movi read kernel 41000000;movi read dtb 42000000;movi read rootfs43000000 300000;bootm 41000000 43000000 42000000# saveenvf) 重新启动开发板,u-boot自动加载、执行内核5、其他命令练习6、交叉编译和交叉调试a) 将u-boot启动参数修改为网络启动#setenv serverip 192.168.9.120#setenv ipaddr 192.168.9.233#setenv bootcmd tftp 410000
15、00 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000- 42000000#setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rwconsole=ttySAC2,115200 init=/linuxrc ip=192.168.9.233# saveenv注意:192.168.9.120 对应Ubuntu的ip192.168.9.233 对应板子的ip这两个ip应该根据自己的实际情况适当修改b) 编辑程序源码myapp.c(自己写一个简单的c程序)
16、c) 交叉编译后复制到/source/rootfs (编译时添加选项-g)$arm-none-linux-gnueabi-gcc myapp.c o myapp g$ cp myapp /source/rootfsd) 复制gdbserver到/source/rootfs/bin (gdbserver在交叉工具链中找,路径为:/home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/debug-root/bin)e) 在开发板上如下运行# gdbserver 192.168.9.233:12345 myapp tmp/* C
17、onfigure SMC_BC register */srom-bcsrom_bank = srom_bc_conf;static void dm9000aep_pre_init(void)unsigned int tmp;unsigned char smc_bank_num = 1;unsigned int smc_bw_conf=0;unsigned int smc_bc_conf=0;/* gpio configuration */writel(0x00220020, 0x11000000 + 0x120);writel(0x00002222, 0x11000000 + 0x140);/
18、* 16 Bit bus width */writel(0x22222222, 0x11000000 + 0x180);writel(0x0000FFFF, 0x11000000 + 0x188);writel(0x22222222, 0x11000000 + 0x1C0);writel(0x0000FFFF, 0x11000000 + 0x1C8);writel(0x22222222, 0x11000000 + 0x1E0);writel(0x0000FFFF, 0x11000000 + 0x1E8);smc_bw_conf 后添加#ifdef CONFIG_DRIVER_DM9000dm9
19、000aep_pre_init();#endif在文件末尾添加#ifdef CONFIG_CMD_NETint board_eth_init(bd_t *bis)int rc = 0;#ifdef CONFIG_DRIVER_DM9000rc = dm9000_initialize(bis);#endifreturn rc;#endif2、 修改配置文件添加网络相关配置$ vim include/configs/fs4412.h修改#undef CONFIG_CMD_PING为#def ine CONFIG_CMD_PING修改#undef CONFIG_CMD_NET为#def ine CO
20、NFIG_CMD_NET在文件末尾#endif /* _CONFIG_H */前面添加#ifdef CONFIG_CMD_NET#define CONFIG_NET_MULTI#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_BASE 0x05000000#define DM9000_IO CONFIG_DM9000_BASE#define DM9000_DATA (CONFIG_DM9000_BASE + 4)#define CONFIG_DM9000_USE_16BIT#define CONFIG_DM9000_NO_SROM 1#de
21、fine CONFIG_ETHADDR 11:22:33:44:55:66#define CONFIG_IPADDR 192.168.9.200#define CONFIG_SERVERIP 192.168.9.120#define CONFIG_GATEWAYIP 192.168.9.1#define CONFIG_NETMASK 255.255.255.0#endif3、 重新编译u-boot$ ./build.sh烧写新的u-boot_fs4412.bin复位后# ping 192.168.9.120四、FLASH移植(EMMC)1、 初始化EMMC$cp movi.c arch/arm
22、/cpu/armv7/exynos/$vim arch/arm/cpu/armv7/exynos/Makefile在pinmux.o 后添加movi.o修改板级文件$vim board/samsung/fs4412/fs4412.c在#include 后面添加#include #include “origen_setup.h“在#ifdef CONFIG_GENERIC_MMC后面添加u32 sclk_mmc4; /*clock source for emmc controller*/#define _REGMY(x) (*(volatile u32 *)(x)#define CLK_SRC_
23、FSYS _REGMY(EXYNOS4_CLOCK_BASE + CLK_SRC_FSYS_OFFSET)#define CLK_DIV_FSYS3 _REGMY(EXYNOS4_CLOCK_BASE + CLK_DIV_FSYS3_OFFSET)int emmc_init() u32 tmp;u32 clock;u32 i;/* setup_hsmmc_clock */* MMC4 clock src = SCLKMPLL */tmp = CLK_SRC_FSYS CLK_SRC_FSYS = tmp | 0x00060000;/* MMC4 clock div */tmp = CLK_DI
24、V_FSYS3 clock = get_pll_clk(MPLL)/1000000;for(i=0 ; iint chk_bootdev(void)/mj for boot device checkchar run_cmd100;struct mmc *mmc;int boot_dev = 0;int cmp_off = 0x10;ulong start_blk, blkcnt;mmc = find_mmc_device(0);if (mmc = NULL) printf(“There is no eMMC card, Booting device is SD cardn“);boot_dev
25、 = 1;return boot_dev; start_blk = (24*1024/MOVI_BLKSIZE);blkcnt = 0x10;sprintf(run_cmd,“emmc open 0“);run_command(run_cmd, 0);sprintf(run_cmd,“mmc read 0 %lx %lx %lx“,CFG_PHY_KERNEL_BASE,start_blk,blkcnt);run_command(run_cmd, 0);/* switch mmc to normal paritition */sprintf(run_cmd,“emmc close 0“);ru
26、n_command(run_cmd, 0);return 0;int board_late_init (void)int boot_dev =0 ;char boot_cmd100;boot_dev = chk_bootdev();if(!boot_dev)printf(“nnChecking Boot Mode . EMMC4.41n“);return 0;#endif2、 添加相关命令$ cp cmd_movi.c common/$ cp cmd_mmc.c common/$ cp cmd_mmc_fdisk.c common/修改Makefile$ vim common/Makefile
27、在COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o后添加COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.oCOBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o添加驱动$ cp mmc.c drivers/mmc/$ cp s5p_mshc.c drivers/mmc/$ cp mmc.h include/$ cp movi.h include/$ cp s5p_mshc.h include/修改Makefile$vim drivers/mmc/Makefile添加COBJS-$(CONFIG_S5P_MS
28、HC) += s5p_mshc.o3、 添加EMMC相关配置$vim include/configs/fs4412.h添加#define CONFIG_EVT1 1 /* EVT1 */#ifdef CONFIG_EVT1#define CONFIG_EMMC44_CH4 /eMMC44_CH4 (OMPIN5:1 = 4)#ifdef CONFIG_SDMMC_CH2#define CONFIG_S3C_HSMMC#undef DEBUG_S3C_HSMMC#define USE_MMC2#endif#ifdef CONFIG_EMMC44_CH4#define CONFIG_S5P_MSH
29、C#define CONFIG_EMMC 1#define USE_MMC4/* #define CONFIG_EMMC_8Bit */#define CONFIG_EMMC_EMERGENCY/*#define emmcdbg(fmt,args.) printf(fmt ,#args) */for emmc debug#define emmcdbg(fmt,args.)#endif#endif /*end CONFIG_EVT1*/#define CONFIG_CMD_MOVINAND#define CONFIG_CLK_1000_400_200#define CFG_PHY_UBOOT_BASE CONFIG_SYS_SDRAM_BASE + 0x3e00000#define CFG_PHY_KERNEL_BASE CONFIG_SYS_SDRAM_BASE + 0x8000#define BOOT_MMCSD 0x3#define BOOT_EMMC43 0x6#define BOOT_EMMC441 0x7#define CONFIG_BOARD_LATE_INIT4、 重新编译u-boot$ ./build.sh烧写新的u-boot_fs4412.bin复位后# mmcinfo