linux驱动基础知识讲解
LK是第2个loader,它由pre-loader引导并执行。从根本上来说 (basically),pre-loader已经初始化了相关的硬件模块,而不需要 在LK中重新配置这些模块了。但一些模块在LK中被重新复位来 配置硬件寄存器,这样可创造一个干净的环境。比如计时器模块, 在LK中,计时器重新复位清零硬件计数来对计时进行复位。所 有在LK中需要初始化的列在下面: (1) 计时器模块 通过复位硬件寄存器来复位计时。 (2) 串口模块 LK采用串口模块来配置它的输入/输出系统,在这个模块初始化 后,我们可以使用LK提供的“printf(…)”等函数来使用串口功能。
Flash 从低地址到高地址方向
MTK的Bootloader 在嵌入式操作系统中,BootLoader是在操作系统内 核运行之前运行。可以初始化硬件设备、建立内存空间 ቤተ መጻሕፍቲ ባይዱ射图,从而将系统的软硬件环境带到一个合适状态, 以便为最终调用操作系统内核准备好正确的环境。 MTK的bootloader有两部分组成:
(4) BootROM跳转到pre-loader的入口处并执行。
(5) Pre-loader初始化DRAM和加载LK到RAM中。
(6) Pre-loader跳转到LK中并执行,然后LK做一些初始化,比如显示的 初始化等。 (7) LK从存储器中加载引导镜像(boot image),包括linux内核和 ramdisk(Android呢?) (8) LK跳转到linux内核并执行。
MTK的Bootloader
正常启动的主要工作如下: (1) 设备上电后,Boot ROM开始运行。 (2) BootROM初始化软件堆栈(software stack)、通信端口和可引导存储 设备(比如NAND/EMMC)。
(3) BootROM从存储器中加载pre-loader到内部SRAM(ISRAM)中,因 为这时候还没有初始化外部的DRAM。
(8) USB模块 当USB线插入时,它初始化来和外部工具通信,比如用于升级 系统的下载工具或是META模式触发器的META工具。 (9) NAND模块 (10) MSDC模块 Pre-loader可以从NAND flash或是EMMC中加载LK,这两者只 能选择其中一种来启动。
LK中涉及的硬件部分
MTK的Bootloader
pre-loaders中涉及的硬件部分
(1) PLL模块 1) PLL模块用于调整处理器和外部内存的频率。 2) 在PLL模块初始化后,处理器和外部内存的频率可由 26MHZ/26MHZ增加到1GHZ/192MHZ。 (2) UART模块 1) UART模块用于调试或是META(Mobile Engineering Testing Architecture)模式下的握手。 2) 默认情况下,UART4初始化波特率为9216000bps和用于调试 信息的输出,UART1初始化为115200bps和作为UART META端口。 但也可以使用UART1作为调试或是UART META端口。 (3) 计时器(timer)模块 这是个基本的模块,用来计算硬件模块所需要的延时或是超时时间。
(4) 内存模块
1) Pre-loader由boot ROM加载和在芯片组内部的SRAM中执行,因 为外部的DRAM还没有初始化。 2) 为了准备软件整个可执行环境,pre-loader采用内置的内存设置来 初始化DRAM(DRAM is initialized upon pre-loader built-inmemory settigns)。这样,LK就能够被加载到DRAM中并执行。 (5) GPIO模块 (6) PMIC模块 为了提供一些基本的硬件功能,比如控制外设电源,pre-loader初始化 上层模块(upper modules)。 (7) RTC模块 1) 当通过power按键开机后,pre-loader拉高RTC的PWBB来保持设 备一直有电(keep the device alive)和继续引导LK。 2) RTC闹钟(alarm)有可能是设备开机的启动源,对于这种情况,设 备部需要按power按键就可自动启动。
(3) I2C模块 (4) PWM模块 (5) PMIC模块 (6) RTC模块 和计时器模块一样,在U-Boot中,I2C/PMIC/RTC重新复位寄存器来 复位这些模块。 (7) LED模块 通过这power off charging个模块,设备能够通知用户当前的充电状态。
(8) 充电模块 这个模块负责关机充电(power off charging)、低电压充电(lower charging in the system)。
(1) 第1部分bootloader,也就是MTK内部(in-house)的preloader,这部分依赖平台。
(2) 第2部分bootloader,也就是 Little Kernel ,这部分依赖 操作系统,负责引导linux操作系统和Android框架。 源码位置: \vendor\mediatek\proprietary\bootable\bootloader
Linux 驱动学习总结汇报
2016年11月12日
内核模块 Bootloder 并发控制 中断处理 设备驱动的结构
Linux内核重要子系统
1. 系统调用接口 2. 进程管理 3. 内存管理 4. 虚拟文件系统 5. 网络堆栈 6. 设备驱动
最简单的嵌入式系统
Bootloader
参数
系统内核
根文件系统
(9) LCD模块 使用这个模块,设备能够显示logo或是任何通知的消息。 (10) NAND模块 因为U-Boot也需要从flash读取镜像(比如内核或是ramdisk), 所以有必要在U-Boot中初始化NAND相关的功能。 (11) MSDC模块 支持MSDC启动
一些重要的数据结构
1. 大部分驱动程序涉及三个重要的内核数据结构: • 文件操作file_operations结构体 • 文件对象file结构体 • 索引节点inode结构体