IMX6ULL GPIO使用:
- 使能时钟
- 设置复用功能
- 设置速度,方向,中断使能,中断触发方式、上下拉方式,驱动能力
- 设置默认电平
施密特触发器:
对于标准施密特触发器,当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变,也就是说输出由高电准位翻转为低电准位,或是由低电准位翻转为高电准位时所对应的阈值电压是不同的。
arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置
IMX6ULL 内部RAM 128K (0X900000~0X91FFFF)
IMX6ULL 外部RAM 起始地址都为 0X80000000,
512MB 的终止地址为 0X9FFFFFFF
256MB 容 量的终止地址为 0X8FFFFFFF
为了和uboot的链接地址一致选择链接地址为0x8780000
IMX6ULL Image包含内容
- IVT 地址向量表,存储一些地址信息
- Boot data 启动数据,启动地址和大小
- DCD 设备配置数据,重点是DRAM配置
- 用户bin文件
IMX6U 也包含中断向量表和中断向量偏移
GIC
Cotect-A7 有8个异常中断
Cotect-A7 的外部中断都叫IRQ中断,发生中断时,通过判断寄存器的值来确定是哪个外设发生了中断。
软中断(Software Interrupt,SWI),由 SWI 指令引起的中断,Linux 的系统调用会用 SWI
指令来引起软中断,通过软中断来陷入到内核空间
①、SPI(Shared Peripheral Interrupt),共享中断,顾名思义,所有核(Core) 共享的中断,这个是最 常见的,那些外部中断都属于 SPI 中断(注意!不是 SPI 总线那个中断) 。比如按键中断、串口 中断等等,这些中断所有的核( Core) 都可以处理,不限定特定 核( Core)。
②、PPI(Private Peripheral Interrupt),私有中断,我们说了 GIC 是支持多核的,每个核肯定
有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。
③、SGI(Software-generated Interrupt),软件中断,由软件触发引起的中断,通过向寄存器
GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信。
每一个 CPU 最多支持 1020 个中断 ID
- ID0~ID15:这 16 个 ID 分配给 SGI。
- ID16~ID31:这 16 个 ID 分配给 PPI。
- ID32~ID1019:这 988 个 ID 分配给 SPI,像 GPIO 中断、串口中断等这些外部中断 ,至于具体到某个 ID 对应哪个中断那就由半导体厂商根据实际情况去定义了。
I.MX6U 的总共 使用了 128 个中断 ID,加上前面属于 PPI 和 SGI 的 32 个 ID,I.MX6U 的中断源共有 128+32=160 个
GIC 分为分发器和CPU接口端
分发器
- 总中断
- 每个中断的控制
- 每个中断的优先级
- 触发模式(边沿、电平触发)
- 设置分组0,1
CPU接口端
- 使能到cpu核心的中断信号
- 应答中断
- 通知中断处理完成
- 设置优先级掩码
- 定义抢占策略
- 多个中断到来时,选择高优先级给cpu核
Cortex-A7 内核来说中断 ID 只使用了 512 个,GICD_ISENABLER0 的 bit[15:0]对应
ID15~0 的 SGI 中断,GICD_ISENABLER0 的 bit[31:16]对应 ID31~16 的 PPI 中断。剩下的
GICD_ISENABLER1~GICD_ISENABLER15 就是控制 SPI 中断的。
寄存器 CPSR 的 I=1 禁止 IRQ,当 I=0 使 能 IRQ;F=1 禁止 FIQ,F=0 使能 FIQ
I.MX6U 支持 32 个优先级