导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    全志V3S嵌入式驱动开发 - uboot,linux kernel和rootfs移植

    爱搞机专区
    全志v3s嵌入式驱动开发
    1
    1
    1561
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • bayche
      bayche LV 6 最后由 编辑

      安装了ubuntu操作系统,有了开发板,下面就可以进行我们的开发工作了。第一步,我们要面临的问题就是uboot移植。一般来说,嵌入式的基础环境就是uboot、linux和rootfs。uboot完成一些基本硬件的初始化,比如cpu频率设置、ddr初始化、加载linux等等。早前,uboot的烧入比较麻烦,需要jtag工具才能完成。现在来说,很多soc支持系统直接从sd卡启动,这对开发者就比较友好了。

      要做好uboot移植,做好四个方面的工作就可以了。第一,下载好uboot代码;第二,安装交叉编译工具;第三,编译uboot;第四,选择好sd卡,将uboot的bin文件烧入到sd卡。这样,将sd卡插入到开发板中,上电,就可以看到uboot的启动画面了,比如像这样,

      2c63c57e7c994af79acdf3caf78fcb14.png

      1、下载uboot代码

      针对uboot代码,可以直接从官方的github地址下载就可以了,

      git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
      

      2、下载交叉编译工具

      目前v3s的交叉编译工具都可以直接从网上下载,下载地址在这个位置,

      https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/
      

      注意,如果是ubuntu系统,可以选择这个安装包即可,

      879e0372504b4f00914be0f833f69cd2.png

      安装好之后,如果发现对应的gcc没有办法打开,记得安装一下lib32的包,

      sudo dpkg --add-architecture i386
      sudo apt-get update
      sudo apt-get install zlib1g:i386 libstdc++6:i386 libc6:i386
      

      并且在.bashrc当中设置一下环境变量,

      export PATH=$PATH:/home/feixiaoxing/gcc-linaro-6.3.1-2017.05-i686_arm-linux-gnueabihf/bin
      

      3,编译uboot

      相比较而言,编译uboot还是比较简单的,cd到uboot目录,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig
      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
      

      如果没有make命令,先用apt-get安装一下make命令,

      sudo apt-get install make
      

      4、烧入sd卡

      做到了前面三步,好像第四步最简单。其实不然,要实现这个功能,要注意两个方面。第一,选择sd卡的时候一定要选择正规的sd卡,差的sd卡是没有办法完成uboot启动的,这算是自己很大的一个教训吧,浪费了不少时间。实践中发现,一线品牌的sd卡更好一点,启动基本没问题。另外一个方面,一定要让虚拟机支持usb功能,虽然开发板使用的是sd卡,但是这种sd卡是micro sd卡,因此需要一个读卡器,所以如果需要ubuntu支持sd卡的读写,最要让虚拟机支持usb,这样才可以完成ubuntu对sd卡的读写功能。

      sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
      

      烧写直接使用dd命令就好了,注意这里烧写的文件是u-boot-sunxi-with-spl.bin,烧入的设备是/dev/sdb,也就是刚刚插入的sd卡。做到这两点,基本就可以保证烧入成功了。

      除了少部分嵌入式设备使用vxworks和freertos之外,大部分嵌入式都是使用linux来做基础os来使用的。linux使用场景很多,除了大家都知道的android设备、娱乐设备之外,在汽车、工控、网络交换机、服务器等领域,linux也扮演着重要的角色。所以,对于linux或者linux kernel来说,大家没必要神话它,也没有必要轻视它,就把它当成一个工具好了,该优化优化、该加驱动加驱动、该写上层软件写上层软件就行。

      前面学习了uboot,板子是可以启动了,但是不能称之为一个完整的系统,因为它还缺少了两样东西,一个是linux kernel,一个是rootfs。

      不同厂家的soc,一般对uboot和kernel,他们自己都已经移植好了,用户只需要到对应的地址下载代码编译即可。而对于rootfs,如果本身没有特殊的需求,可以考虑直接使用别人做好的rootfs.tar,这样效率会高很多。

      1、下载linux kernel

      git clone https://github.com/Lichee-Pi/linux.git -b zero-4.10.y
      

      不出意外,我们就可以下载到4.10.y版本的linux内核代码,首先,配置config文件

      make ARCH=arm licheepi_zero_defconfig
      

      接着,开始编译内核,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
      

      这个时候就可以搜索发现,生成了一个zImage文件,接着继续编译设备树

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
      

      最后就是生成驱动modules,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules
      

      当然,如果需要自己把驱动放到统一的目录里面,就可以这么做,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules_install
      

      2、编译rootfs

      关于rootfs,一般都是用buildroot进行配置编译的。之前练习的时候,下载的buildroot版本是buildroot-2017.08.tar.gz。这部分还是建议使用别人编译好的根文件系统,差别不大,编译好之后,在./output/images目录下面,会有一个rootfs.tar文件,这就是我们需要的根文件系统。在文章的最后,我们也给出了自己编译好的rootfs.tar下载地址,供大家参考。

      3、烧入sd卡

      除linux kernel编译和rootfs编译之外,另外很重要的一个部分就是sd卡烧入。所有的操作都是在ubuntu虚拟机里面完成的,有这么几个流程,

      3.1 分区

      利用ubuntu里面的fdisk进行分区,输入

      sudo fdisk /dev/sdb
      

      分成两个区即可,第一个分区32M,剩下的空间留给另外一个分区,注意在第一个分区的最后一步输入+32M即可。

      3.2 在刚才创建好的分区构建文件系统

      sudo mkfs.vfat /dev/sdb1
      sudo mkfs.ext4 /dev/sdb2
      

      3.3 重新插拔sd卡

      sudo sync
      sudo eject /dev/sdb
      

      3.4 拷贝文件

      把zImage和sun8i-v3s-licheepi-zero.dtb拷贝到vfat分区,与此同时把rootfs.tar拷贝到ext4分区,并解压,

      tar -xvf rootfs.tar ./
      

      因为之前已经烧入过uboot,这步可以省略,当然不放心的话,可以再烧入一下,

      sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
      

      3.5 重启板子,因为uboot中我们没有对代码进行修改,所以uboot启动后,需要输入下面这些命令,才能启动kernel

      setenv bootm_boot_mode sec
      load mmc 0:1 0x41000000 zImage
      load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb
       
      setenv bootargs console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0
      bootz 0x41000000 - 0x41800000
      

      4、效果图

      之前说过,uboot启动后,如果需要进入Linux,那么需要进行一些配置,效果如下,

      221759927b9e45178b330fb87bb54635.png

      所有命令输入完毕之后,也就是输入bootz 0x41000000 - 0x41800000后,kernel就可以开始启动了,

      7e30dc37f5f74c79ad0ab413e7ab64f0.png

      因为目前驱动的内容比较少,上层软件也不多,所以不到2s就启动结束,这里输入rootfs之后,马上就进入根文件系统了,

      12e35cd572ad4b83b7acb436bdb295af.png

      至此,一个最小的嵌入式linux系统就已经实实在在的跑起来了。

      1 条回复 最后回复 回复 引用 分享 1
      • 1 / 1
      • First post
        Last post

      Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

      行为准则 | 用户协议 | 隐私权政策