S5PV210-uboot源码分析-uboot的硬件驱动部分

1、裸机中本身是没有驱动概念的。

狭义上的驱动的概念是操作系统中用来具体操控硬件的那部分代码叫驱动。

广义上讲,只要是操控硬件的都算是驱动。

2、裸机程序中是直接操控硬件的,但是在操作系统中我们必须通过驱动操控硬件。

(1)这两个有什么区别呢?本质区别就是分层的问题

3、uboot的虚拟地址对硬件操作的影响

(1)操作系统(linux)下,MMU肯定是开启的。也就是说Linux驱动中肯定使用的都是虚拟地址,而裸机程序中肯定不会开MMU。

(2)在操作系统下只有虚拟地址可以用,物理地址是不可以用的。所以一提到驱动,肯定是和虚拟地址有关的

(3)以前的uboot是不开启MMU的,但是现在的UBOOT会开启MMU,查uboot的虚拟地址映射表,知道物理地址0X30000000-0X3FFFFFFF映射到了0XC0000000-0XCFFFFFFF这个范围,其他的部分都是原样的。因为驱动是操控硬件的,操控硬件寄存器的,所以驱动就需要考虑虚拟地址到物理地址。但是在我们的S5PV210中SFR都在0XEXXXXXXX地址的空间,所以驱动就不需要考虑虚拟地址了

4、uboot中借用(移植)了Linux驱动。

(1)Linux驱动本身做了模块化的设计,Linux驱动和Linux内核不是强耦合的(两者很黏的在一起),所以这是Linux驱动可以被uboot移植的关键。

10、1、inand/SD驱动解析1

1、从start_armboot开始

(1)驱动的整体是很庞大的,涉及到了很多个文件夹下的很多文件,函数更多,所以要知道从哪里开始入手

2、mmc_initialize

(1)这个函数在uboot/deviers/mmc/mmc.c中

(2)这个函数来初始化开发板的MMC系统的,初始化的部分包括:初始化SoC中MMC控制器(MMC系统时钟的初始化、SFR)、SoC里MMU相关的GPIO的初始化、SD/iNand芯片的初始化。(SD卡本身内部有一个cpu,类似于51单片机,本身就有一些内存的读写,我们主机SOC只需要通过MMC控制器向SD卡发一些时序和指令)

(3)mmc_devices链表,用来记录所有已注册的MMC(SD/INAND)设备。所以当我们系统中多了一个SD/INADN设备时,系统驱动就会想mmc_devices中插入一个节点,代表插入了一个这个设备

3、cpu_mmc_init

(1)setup_hsmmc_clock

初始化SOC中MMC控制器时钟

(2)setup_hsmmc_cfg_gpio

配置SOC里MMC控制器相关GPIO的。

10、2、inand/SD驱动解析2

1、smdk_s3c_hsmmc_init

2、s3c_hsmmc_initialize,这个函数在uboot/drivers/mmc/s3c_hsmmc.c中

(1)struct mmc *mmc;

struct mmc设备驱动,就是表示一个MMC卡的所有信息等等,就是一个类,这个类就是mmc类,sd卡类,具体的每一个SD卡就是这个类的每一个实例

(2)这个函数的作用就是,定义并且实例化一个MMC类的对象。然后填充对象里面的各个成员,最后调用mmc_register来向驱动框架来注册这个mmc设备驱动。就是创建了一个设备(对象)(节点),把这个设备的相关信息添加到这个对象中,完了,用链表插入的方法,插入到这个链表中。这个链表是管理mmc的那个链表数据结构。

(3)我们的x210中,定义了USE_MMC0 和USE_MMC2两个,所以这个s3c_hsmmc_initialize 会被初始化两次,所以会有两个mmc设备被注册到我们的mmc设备驱动上。这两个实例化的对象,会被挂接注册到mmc_devices这个链表管理的mmc设备驱动上。  所以表示当前系统中有两个mmc通道是使用。

(4)find_mmc_device(0);//查找mmc设备驱动中,注册上了0编号的mmc设备没有。

(5)list_for_each(entry, &mmc_devices) //这个宏来遍历这个mmc_devices这个链表,遍历这个链表的所有设备驱动

(6)mmc_init,初始化SD/Inand芯片(通过SOC的MMC控制器向这个mmc设备发时序和指令),通过我们已经注册上的mmc设备(是相对于SOCmmc控制器而言的),发送一些MMC卡相关的CMD命令码,来初始化mmc(SD/INAND)芯片内部的控制器。目的是让sd/inand可以工作

总结:

MMC系统的初始化整个分为两个大部分,一部分是SOC内部的MMC控制器的初始化,这个初始化是在cpu_mmc_init函数中完成的。第二部分是初始化SD/INAND本身芯片内部的控制器,在mmc_init函数中完成的。

第一部分,注册mmc,相对于SOC内部来讲,就是将相应的通道对应的相关配置初始化,让这个通道可以工作了,将这个注册好的挂接到mmc链表管理设备驱动的链表上。

第二部分,通过我们这个mmc链表管理设备驱动的链表上,找到我们相应的工作的mmc驱动。通过soc中的MMC控制器向SD/INAND本身的芯片发送命令码来初始化SD/INAND使得其可以工作。

··代码如这样mmc_send_cmd(host, &cmd, NULL);//用host代表的设备驱动,好使的SOC控制器,向mmc卡发送cmd命令

host就是我们注册上去的那个mmc驱动。

10、3、inand/SD驱动解析3

1、struct mmc

(1)驱动的设计中一个关键的数据结构。这些结构体中包含一些成员和一些函数指针,变量用来记录驱动相关的一些属性,函数指针用来记录驱动相关的操作函数。这些变量和函数指针加起来就构成了驱动。驱动就被抽象为了一个结构体。

(2)一个驱动工作时主要分为这么几个部分:驱动构建(类似用mmc类定义构建一个struct mmc的对象,并且将这个对象进行填充),驱动在运行时调用这些函数指针指向的函数和我们我的这些变量来完成工作。

2、分离思想

(1)分离思想就是说在驱动中将操作方法和数据分离开。在不同的地方存储和管理驱动的操作方法和变量,这样便于移植和维护

(2)数据就一些变量和一些参数,操作方法就是函数。

(3)

3、分层思想

(1)分层思想是指一个整个的驱动分为好个层次。简单理解就是驱动分成很多个源文件,放在和多个文件夹中,如果mmc的驱动设计到drivers/mmc下的两个文件,和cpu/s5pc11x中的还几个文件。

时间: 2024-10-12 07:46:12

S5PV210-uboot源码分析-uboot的硬件驱动部分的相关文章

u-boot源码分析之C语言段

题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这很像我们中国<易经>里的一句话:"太极生两仪,两仪生四象."两仪指的就是阴阳.天地,对立而又相互依存的一切,它们生成了天地万物.简单的0和1就构成了我们现在所用的操作系统,各种软件.硬件也是由高低电平控制,0和1就是万物. 刚刚在读一本科幻小说,里面提到一种叫做"脑域

u-boot学习(三):u-boot源码分析

建立域模型和关系数据模型有着不同的出发点: 域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度 Hibernate 把持久化类的属性分为两种: 值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期 实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期(如果实体类型包含值类型,这个值类型就

S5P210-uboot源码分析-uboot如何启动内核

uboot如何启动内核 7.1.uboot和内核到底是什么? 1.uboot是一个裸机程序 (1)uboot的本质就是一个复杂点的裸机程序,和我们arm裸机中写的程序没有什么本质上的区别. (2)uboot最像我们在arm裸机中的最后写的那个shell,它其实就是一个迷你型的uboot. 2.linux内核本身也是一个"裸机程序" (1)操作系统内核本身就是一个裸机程序,和uboot并没有本质区别. (2)区别在于,操作系统运行起来后在软件层次上可以分为内核层和应用层,分层后两层的权限

(十)uboot源码分析

一.九鼎官方uboot和三星原版uboot对比(1)以九鼎官方的uboot为蓝本来学习的,以三星官方的这份为对照.(2)不同版本的uboot或者同一版本不同人移植的uboot,可能目录结构和文件内容都有所不同.将来大家懂了后也可以自己根据需要去添加/删除/更改目录结构.(3)九鼎在以三星的uboot为原材料进行移植时,把三星版本的uboot中很多不必要的文件夹.文件给删除掉了.这个删除把很多完全用不到的文件清除出去,减少了整体的文件数量,便于工作. 二.各文件介绍(1).gitignore.gi

S5PV210-uboot源码分析-uboot环境变量

9.1.uboot的环境变量 1.环境变量的作用 (1)在我们不改变uboot源代码的情况下,只需要改变环境变量的值就可以改变uboot运行时的数据和一些特性.比如说,通过修改bootdelay环境变量,就可以更改开机倒数的秒数. 2.环境变量的优先级 (1)uboot代码当中有一个值,环境变量(DDR 环境变量的分区中)中也有一个值,uboot程序实际运行时,规则是,如果环境变量(DDR中环境变量的分区)为空,则使用代码中的环境变量的值,如果环境变量不为空,优先使用环境变对应的值. (2)比如

2.uboot和系统移植-第5部分-2.5.uboot源码分析1-启动第一阶段

第一部分.章节目录 2.5.1.start.S引入 2.5.2.start.S解析1 2.5.3.start.S解析2 2.5.4.start.S解析3 2.5.5.start.S解析4 2.5.6.start.S解析5 2.5.7.start.S解析6 2.5.8.start.S解析7 2.5.9.uboot重定位详解 2.5.10.start.S解析8 2.5.11.start.S解析9 2.5.12.start.S解析10 2.5.13.start.S解析11 第二部分.章节介绍 2.5.

uboot源码分析1-启动第一阶段

1.不简单的头文件包含 #include <config.h>:这个文件的内容其实是包含了一个头文件:#include <configs/x210_sd.h>". #include/version.h中包含了include/version_autogenerated.h,这个头文件就是配置过程中自动生成的.里面就一行内容:#define U_BOOT_VERSION "U-Boot 1.3.4" 2.启动代码的16字节头部 3.异常向量表的构建 4.用

S5PV210-uboot源码分析-第一阶段

uboot源码分析1-启动第一阶段 1.starts.S是我们uboot源码的第一阶段: 从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口.所以_start符号所在的文件,就是我们整个程序的起始文件,_start所在处的代码就是我们整个程序的起始代码. 2.我们知道了程序的入口是_start这个符号,但是却不知道是在哪一个文件中,所以要SI进行查找搜索,点击SI的大R进行搜索

uboot移植——uboot源码目录分析

uboot移植(一)--uboot源码目录分析 本文分析的uboot是九鼎官方提供的,是对应s5pv210开发板x210bv3的uboot 一:uboot的概念及移植的原理. uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图.从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能. 移植原理:uboot中有很多平行代码,各自属于各