站在芯片原厂角度移植最新u-boot 2020.07到jz2440开发板(1)(全部驱动使用设备树与dm设备模型)

本文详细介绍从零开始移植U-Boot到JZ2440开发板的过程,涵盖驱动开发、设备树配置及SPL使用,实现串口、SD卡等驱动功能。

1. 概述

1.1 缘由

最近在待业,由于之前的工作是在一个初创的芯片原厂做底层驱动开发,所以最近想着能不能以一个芯片原厂的角度移植最新的u-boot到jz2440开发板呢?于是便有了这篇文章。

整篇文章遵循着以问题为导向的讲解方式,重实践,基本没有原理性的知识,并且从零开始进行移植。我相信,如果你能认真的跟着文章实际操作一把,以后不管遇到什么类型的芯片、什么类型的开发板,同样都能完成从零移植u-boot的工作。

1.2 实现的功能

移植的u-boot 2020.07目前实现的功能如下:

  1. 如标题所述,全部驱动使用设备树与dm设备模型
  2. 实现的驱动:
  • 串口驱动
  • sdcard驱动
  • usb udc驱动
  • nand flash驱动
  • gpio子系统驱动
  • pinctrl子系统驱动
  • clock子系统驱动
  1. 硬件无关的命令可以按需添加
  2. 硬件相关的命令:
  • 一些基本的必须的命令,如nand,mmc等

  • ums命令(通过usb总线,支持在pc端查看sdcard中的文件系统,暂时由于sdcard驱动问题导致当分区文件内容比较大时会不稳定)

  • dfu命令(通过usb总线,支持在pc端下载文件到nand flash)

  1. 其他:
  • 支持从nand flash启动u-boot以及内核
  • 支持从sdcard启动u-boot以及内核,内核映像文件以及dtb文件放在sdcard的第一个vfat格式分区中,根文件系统放在第二个ext4格式分区中

1.3 后续文章写作思路

我打算把移植工作分为一系列的文章来进行讲解:

  1. 本篇文章,讲解到以最小的改动实现最初始的打印u-boot启动信息功能为止;
  2. 以驱动为分类标准,之后的每一个驱动单独用一篇文章来讲解。

另外,之后如果有时间会有相同思路的移植最新linux内核的系列文章,敬请期待!

2. spl闪亮登场

2.1 引入

在讨论u-boot之前,我们需要认识另一位兄弟——spl,这里我暂且称为spl,首先它并不是u-boot中的spl(second program loader,第二程序加载器,相对于soc中固化的bootcode代码而言),但是作用是相同的,那具体是什么呢?

我这里所谓的spl,主要是参考韦东山老师的自己写bootloader的课程中的内容,一个独立于u-boot的工程。

如果将u-boot直接放在nand flash的0地址处,我们知道如果设置开发板为nand flash启动,s3c2440上电后会自动从nand flash复制4KB代码到内部ram,然后运行。这样,u-boot的重定位代码可能会在4KB之后,那之后的u-boot的代码就不会被重定位到sdram,这样显然是不行的。

所以,spl便是我的一个解决方法:

  1. 首先初始化时钟、sdram以及外部存储设备;
  2. 然后将u-boot从外部存储设备(sdcard或者nand flash)直接复制到sdram中;
  3. 最后调整pc指针到u-boot所在的sdram地址处直接运行u-boot。

2.2 工程构成

整个spl工程构成如下图所示,
在这里插入图片描述可以看到,基本和韦东山老师自己写bootloader的课程中的内容一致,唯一不同的一点是,之前由于学习sdcard裸机驱动,我在网上找了一个s3c2440的sdcard裸机驱动代码,现在正好,如果将u-boot.bin放到sdcard中相比于nandflash,对于调试来说那将是非常的方便,只要有一个读卡器,复制一个几百k的u-boot.bin不需要一秒就可以完成。

2.3 整体思路

整个spl的思路如下:

  1. 首先初始化栈、时钟、sdram、nand flash,

    .text
    
    .global _start
    
    /*****************************************************************************/
    
    @程序入口
    
    _start:
    @ 0x00: 复位异常的向量地址
    	b Reset
    @ 0x04: 未定义指令中止模式的向量地址
    HandleUndef:
    	b HandleUndef
    @ 0x08: 管理模式的向量地址(在用户模式下,可通过SWI指令进入该模式)
    HandleSvc:
    	b HandleSvc
    @ 0x0c: 指令预取中止异常的向量地址
    HandlePrefetchAbort:
    	b HandlePrefetchAbort
    @ 0x10: 数据访问中止异常的向量地址
    HandleDataAbort:
    	b HandleDataAbort
    @ 0x14: 保留
    HandleNotUsed:
    	b HandleNotUsed
    @ 0x18: 中断模式的向量地址
    HandleIRQ:
    	b HandleIRQ
    @ 0x1c: 快中断模式的向量地址
    HandleFIQ:
    	b HandleFIQ
    
    /****************************
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值