驱动学习目标:
1: 芯片的启动流程
2: uboot(一切的嵌入式设备都是来自uboot的启动)
3: 内核和文件系统(所有的开发板开发的大前提)
4: 驱动内核的框架
5: 内核的杂项驱动开发
6: Linux2.6 内核驱动开发
7: 多节点 + 文件内核接口
8: Linux下的中断 + 等待队列
9: Linux的定时器和POLL轮询
10:小任务和工作队列
11:内核的同步机制
12:平台设备总线
13:输入子系统
14:产品发布
1、裸开发板 --- 7寸 屏幕800*480(32bit)
串口线:
CPU:
三星的Exynos4412
四核的CPU
主频 1.4 GHZ
内部自带:64KB i_ROM(不丢失)
内部再带:256KB i_RAM(丢失)
开发板:
友善之臂的Tiny4412 开发板
开发板的资源:
* 蜂鸣器
* 四个用户按键
* 电源开关(左边拨码开关)
* 启动方式的拨码开关(右边)
* 向上拨 内部4GB(emmc)启动
* 向下伯 外部的SD卡启动
* UART0--DB9--调试控制串口
* HDMI + MIC
* 自带两个USB口(自带驱动)
可以插摄像头
可以插USB网卡
* 网口--RJ45--百兆
* 支持 RTC
* SPI接口
* 三个UART接口
* 四组IIC--但是一个IIC
* DVP摄像头接口
* 一大组GPIO口
现在市场上的芯片大部分架构
一般都是 ARM架构的
ARM:三大系列
A系列 (高端芯片)
M系列 (工控)M0 M3 M4 M7
R系列 (军工/实时)
A系列的芯片除了芯片的频率高,DSP/解算/AI能力很强,外设是很弱的!它只有一些基本外设,一个SPI ,两个定时器。
裸机:指的是一个没有操作系统的硬件系统!
三个阶段的启动流程
三星自带了一个 IROM——64KB
不是让用户用的,这个空间是芯片厂商他预留给自己用的空间,已经存储了厂商出场的代码,不可访问不可修改,且加密!它把该空间的代码叫做 irom_code,通常把它称为 BL0 第一个阶段,上电就会自动运行的代码!
BL0做了以下操作:(第一阶段运行的是BL0)
1: 关闭窗口看门狗
2: 关闭了中断和内存保护单元
3: 关闭D_CACHE 开启 I_CACHE
4: 刷新TLB向量表 初始化缓冲
5: 制作 内核 1 的空闲
6: 查看是否处于安全模式/睡眠模式
不是往下走
7: 初始化 中断和管理员权限的堆栈空间
8: 初始化 ZI/RW
9: 注册函数指针
10:获取复位状态
11: 设置芯片PLL锁相环以及驱动时钟
12: 获取开发板的启动方式
右边的拨码开关决定启动方式
13: 这段代码该做的事情做完了!
它就会寻找下一阶段代码去运行,从启动的存储介质的特殊位置下载第二阶段代码,运行到 SRAM(256)空间中。使命结束,开始运行第二阶段代码。
* 总结两句话 :BL0 开始各种初始化,BL0 引导出了BL1
BL1 在SD 卡的第一个扇区
* 它做了以下操作:
1: 各种初始化
2: 判断开发板的启动方式
3: 搬运下载BL2 代码到SRAM中
至此它的生命就结束了
* 因为该阶段的代码也是三星提供的,只提供了一个加密后的二进制文件
BL2阶段:(Uboot--启动文件)
它在SD卡第17扇区处开始
BL2做了以下操作:
*在一次初始化堆栈空间
*设置整体开发板的时钟
*将CPU的频率推上顶峰
1.4 GHZ
* 初始化DRAM(DDR3 RAM--1GB)
就可以用 1GB 内存空间了
* 又一次检测开发板的启动方式
* 为了去搬运操作系统!(内核)
把内核搬运到DRAM中运行
这个时候就开始运行操作系统了!
编译
编译一个代码需要编译器!
编译器:将你写的代码转为汇编再转成二进制代码的软件
安装交叉编译工具
安装:
1: 解压压缩包
sudo tar -xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C /
会在根目录生成 opt 文件夹 !
这个就是交叉编译工具
2: /etc/profile
传说中 环境变量文件!环境变量可以再此修改!
在最后一行添加
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin
3: 重启这个文件
source /etc/profile
执行
arm-linux-gcc -v
执行成功即代表安装成功。