开发板环境的搭建

交叉编译工具

  1. 将文件拷贝到linux目录下,解压
  2. 设置环境变量:vim ~/.bashrc 最后添加 解压后文件内的bin文件路径
    export PATH=$PATH:xxx/bin
  3. 更新环境变量:source ~/.bashrc

开发板启动方式

开发板在启动上电后会启动uboot加载内核以及加载dtb设备文件,内核加载时需根据dtb文件对相关硬件进行初始化,内核加载完毕后挂载根文件系统。

uboot:启动引导内核与dtb文件
内核ulmage/zlmage:挂载根文件系统
rootfs:包含bin/sbin/etc/,通过这些文件可以实现系统命令ls等,以及.ko、可执行文件。

对于文件存放与烧录:
方式1:将uboot、内核ulmage、dtb文件、rootfs都存放在emmc中,上电启动后IROM将uboot拷贝到DDR中运行,Uboot在引导加载emmc中内核文件与dtb文件到内存中,最后挂载emmc中rootfs文件。
方式2:将uboot存放于emmc中,内核、dtb文件与根文件系统存放在主机/tftpboot目录中,通过tftp网络方式加载到内存中,根文件系统rootfs通过NFS共享文件方式在开发版中挂载。

方法2将减少我们不断对开发板重新烧录的步骤,只需在主机上进行修改。但在实际开发中,需要将代码固化在开发板emmc中,因此视情况选择两种方式。

操作步骤:

通过tftp启动内核:

  1. 内核、dtb文件与内核文件存放在主机/tftpboot目录中,开发板设置参数,使其能够将内核文件与dtb文件通过tftp网络方式加载到内存
  2. 设置bootcmd参数,其中tftp为网络下载,bootm为启动内核命令,参数1位运行地址,参数2 - 为预留位置给ramdisk,参数3为运行时读取的内容。
    set bootcmd tftp 0x41000000 uImage ; tftp 0x42000000 dtb文件 ; bootm 0x41000000 - 0x42000000
  3. 设置主机ip:set serverip [ip地址]
  4. 设置开发板ip:set ipaddr [ip地址] //需与主机在同一网段
  5. 保存设置:
    save
  6. 查看检查uboot参数:print

通过NFS挂载根文件系统:

  1. 将根文件系统解压到主机ubuntu中
  2. 配置NFS服务器(需要安装),让当前解压后的文件可以被挂载
    通过vim /etc/exports 配置, 格式:/路径 *(subtree_check,rw,async,no_root_squash)
  3. 重启NFS服务器 service nfs-kernel-server restart
  4. 测试是否能挂载:mount -t nfs localhost:/路径 /mnt;cd到/mnt,查看目录是否挂载成功;umount /mnt 卸载挂载目录
  5. 在开发板中指定内核要挂载的根文件系统
    set bootargs console=ttySAC2,115200 init=/linuxrc root=/dev/nfs rw nfsroot=192.168.xx.xx:/路径 ip=192.168.xx.xx
  6. 保存设置:
    save

其中bootargs为uboot传递给内核的启动参数,是一个字符串
console=xxx:告诉内核启动时候到调试信息是从哪个设备输出
init=xxx:告诉内核linux到第一个用户进程是什么
root=xxx:告诉内核根文件系统在哪里,/dev/nfs为网络远端,nfsroot=192.168.xx.xx:/路径 为主机指定路径的文件(ip:path格式),
ip=xxx:告诉内核开机后的ip地址为多少(静态分配ip)

设备树文件

内核版本在3.1后引入了设备树,描述设备信息。
在arch/arm/boot/dts目录下,找匹配的设备树配置文件,修改Makfile中的信息,加入需要编译的dtb文件,回到内核源码顶层目录 make dtbs,生成uImage和dtb文件。
dts:源文件
dtb:device tree blob 二进制文件

网卡移植

对设备树配置文件进行修改
vim arch/arm/boot/dts/exynos4412-fs4412.dts
添加代码,并且重新编译成dtb文件,make dtbs
修改内核选项make menuconfig,添加DM9000选项,再次编译内核 make uImage -j2
将设备树文件与内核放回tftpboot目录。
uboot中设置添加参数到bootargs最后: clk_ignore_unused

srom-csl@5000000{
	compatible = "simple-bus";
	#address-cells = <1>;
	#size-cells = <1>;
	reg = <0x5000000 0x1000000>;
	ranges;

	ethernet@5000000{
		compatible = "davicom,dm9000";
		reg = <0x5000000 0x2 0x5000004 0x2>;
		interrupt-parent = <&gpx0>;
		interrupts = <6 4>;
		devicom,no-epprom;
		mac-address = [00 0a 2d a6 55 a2];
	};
};

你可能感兴趣的:(linux驱动)