Linux 是一个运行在保护模式下的 32 位操作系统,采用 flat memory 模式,目前最常用到的是 ELF 格式的二进制代码。一个 ELF 格式的可执行程序通常划分为如下几个部分:.text、.da
我们在MX27的nandboot中可以看到几个头文件:
mx27.h mx27ads.h hal_platform_setup.h
其中hal_platform_setup.h就是ARM初始化开始的一些汇编操作。
那么首先看看hal_platform_setup.h该文件,另外两个头文件就不多说了,只介绍用到的一些定义
首先声明相关定义:
#define SOC_SI_ID_REG 0x10027800 ---定义在page145页,可以看到该芯片的ID
#define _reg_SOC_SI_ID_REG (*((volatile unsigned long *)(SOC_SI_ID_REG)))
static void setup_iomux(void) --设置GPIO脚的功能,是复用还是常用的GPIO
{
if (!(_reg_SOC_SI_ID_REG & 0xF0000000)) { ----首先看看ID的最高4bit,VerisionID是否有效
/*MX27 TO1 */ ------最高是0000,那么就是TO1版本
下面就是修改CLOCK, MX27寄存器的地址从0x10027000 --0x10027FFF也就是CRM,具体在page115页查找
PCDR0和PCDR1,地址是0x10027018和0x1002701C,这两个是外围设备时钟分配寄存器,page128
_reg_CRM_PCDR1 |= 0x5; //设置时钟分配参数,低位0-5是设置串口、GPT、PWM的时钟
_reg_CRM_PCDR1 &= 0xFFFFFFC5;
}
/* enable clock for HCLK BROM and UART_1 */
_reg_CRM_PCCR1 |= 0x80400400; ----设置PCCR1-0x10027024,该寄存器和上面的PCDR是关联的寄存器,该寄存器就像是开关,将上面设置好的各个模块的频率,如果要达到某个模块,那么需要用这个寄存器来使能,该寄存器的名称就是: 外围设备时钟控制寄存器,和上面的PCDR :外围设备时钟分频设置寄存器, 注意两者区别!
下面的这个需要说明的是,MX27的管脚功能定义非常的丰富,举个例子:
封装中的D24脚,
1.它分为复用功能脚,或者是GPIO脚,可以选择!
2.如果是复用功能脚,那么还要选择是主复用功能(USBTH1_TXDP),还是次复用功能(UART4_CTS)
3.如果选择的是GPIO脚,那么要选择是否上拉,或者直接三态设置,INPUT或者是OUTPUT的选择!
GIUS和GPR寄存器设置,具体查看我的MX27应用手册中的第六章
/* Set up GPIO/IOMUX for UART_1 */ 查看page 254
_reg_GPIO_GIUS(GPIOE) &= 0xFFFF0FFF; /* clear bit 12-bit 15 of GIUS_E */
_reg_GPIO_GPR(GPIOE) &= 0xFFFF0FFF; /* clear bit 12-bit 15 of GPR_E */
设置查看page 227中的PE7 uart2_Rx 和PE6 uart2_tx
_reg_GPIO_GIUS(GPIOE) &= ~0x00000d8; /* port E pin 3,4,6,7 for uart2 */
_reg_GPIO_GPR(GPIOE) &= ~0x00000d8; /* port E pin 3,4,6,7 for primary function */
}