DM3730 x-loader 分析 五
2015-05-30 16:18
281 查看
我们来做一个实验,实验目的是在x-loader中点亮LED灯,因此先分析x-loader\include\asm\arch-omap3\gpio.h,在实验中会用到这里面的函数。
下面是gpio.h源码:
43-50行:/*定义gpio_bank 类型的变量数组gpio_bank_34xx[6],宏替换后可写成如下
static struct gpio_bank gpio_bank_34xx[6] = {
{ (void *)0x48310000, 4 }, /*(void *)0x48310000 把0x48310000强制转换成地址,这样C语言才能识别*/
{ (void *)0x49050000, 4 },
{ (void *)0x49052000, 4 },
{ (void *)0x49054000, 4 },
{ (void *)0x49056000, 4 },
{ (void *)0x49058000, 4 },};
struct gpio_bank {
void *base;
int method; }; /*gpio_bank 结构体定义*/
在sprugn4r.pdf P3500找到地址对应含义,DM3730中gpio0~gpio192分成6个组。
52行:/*定义gpio_bank类型指针gpio_bank,并指向gpio_bank_34xx[6] 数组的第一个元素*/
54行:/*定义get_gpio_bank(int gpio)函数,它的返回值是gpio_bank类型的指针(地址),也就是指向
gpio_bank_34xx[6]数组里面的某个元素地址*/
56行:/*gpio右移5位,实际是gpio除以32,得到gpio组值,返回组地址*/
89-62行:/* get_gpio_index(int gpio)行数目的得到gpio组内编号,例如gpio171=10101011 & 11111=0d1011,整好等于11,对应ds P3489,gpio171 = GPIO6【11】*/
64-81行:/*check_gpio(int gpio)函数,判断gpio是否在0-192之间,是返回0,不是报错返回-1。*/
84-89行:void *reg = bank->base; /*定义指针reg,reg=(*bank).base*/
u32 l; /*unsigned int I*/
switch (bank->method) /* switch (4) */
case METHOD_GPIO_24XX:
/* case 4: */
reg += OMAP24XX_GPIO_OE;/* reg = reg + 0x0034 ,0x0034正好是GPIO_OE寄存器的偏移地址,
运行后reg指向gpio1-6某个组的GPIO_OE寄存器地址*/
94-100行:/*读出gpio1-6某个组的GPIO_OE寄存器里面的值赋给I,如果is_input=1,I的某位值制1,否则I的某位清零*/
以上分析_set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)这个函数,通过传递
gpio组地址,gpio组内编号,设置输入输出1或者0,配置GPIO_OE寄存器,GPIO_OE寄存器含义如下:
102-110行:/*omap_set_gpio_direction(int gpio, int is_input)这个函数是实际要用到的配置gpio输入输出函数*/
108行:/*bank指向gpio_bank_34xx[6]数组里面的某个元素地址*/
109行:_set_gpio_direction(bank, get_gpio_index(gpio), is_input)/*函数参数传递*/
以上分析完如何设置相应gpio输入输出GPIO_OE寄存器
112-142行:同样操作GPIO_SETDATAOUT和GPIO_CLEARDATAOUT寄存器,根据输入的gpio,得到gpio组编号以及组内编号,对应寄存
器里相应位置写入0或者1.
143-161行:/*操作GPIO_DATAIN寄存器,设置输入并读取相应gpio的值*/
159-160行:/*GPIO_DATAIN寄存器中相应gpio位置的值保留*/
下面我们把代码添加到omap3stalker.c文件中,323行和325-332行
运行信息如下:打印出 my gpio out end
下面是gpio.h源码:
43-50行:/*定义gpio_bank 类型的变量数组gpio_bank_34xx[6],宏替换后可写成如下
static struct gpio_bank gpio_bank_34xx[6] = {
{ (void *)0x48310000, 4 }, /*(void *)0x48310000 把0x48310000强制转换成地址,这样C语言才能识别*/
{ (void *)0x49050000, 4 },
{ (void *)0x49052000, 4 },
{ (void *)0x49054000, 4 },
{ (void *)0x49056000, 4 },
{ (void *)0x49058000, 4 },};
struct gpio_bank {
void *base;
int method; }; /*gpio_bank 结构体定义*/
在sprugn4r.pdf P3500找到地址对应含义,DM3730中gpio0~gpio192分成6个组。
52行:/*定义gpio_bank类型指针gpio_bank,并指向gpio_bank_34xx[6] 数组的第一个元素*/
54行:/*定义get_gpio_bank(int gpio)函数,它的返回值是gpio_bank类型的指针(地址),也就是指向
gpio_bank_34xx[6]数组里面的某个元素地址*/
56行:/*gpio右移5位,实际是gpio除以32,得到gpio组值,返回组地址*/
89-62行:/* get_gpio_index(int gpio)行数目的得到gpio组内编号,例如gpio171=10101011 & 11111=0d1011,整好等于11,对应ds P3489,gpio171 = GPIO6【11】*/
64-81行:/*check_gpio(int gpio)函数,判断gpio是否在0-192之间,是返回0,不是报错返回-1。*/
84-89行:void *reg = bank->base; /*定义指针reg,reg=(*bank).base*/
u32 l; /*unsigned int I*/
switch (bank->method) /* switch (4) */
case METHOD_GPIO_24XX:
/* case 4: */
reg += OMAP24XX_GPIO_OE;/* reg = reg + 0x0034 ,0x0034正好是GPIO_OE寄存器的偏移地址,
运行后reg指向gpio1-6某个组的GPIO_OE寄存器地址*/
94-100行:/*读出gpio1-6某个组的GPIO_OE寄存器里面的值赋给I,如果is_input=1,I的某位值制1,否则I的某位清零*/
以上分析_set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input)这个函数,通过传递
gpio组地址,gpio组内编号,设置输入输出1或者0,配置GPIO_OE寄存器,GPIO_OE寄存器含义如下:
102-110行:/*omap_set_gpio_direction(int gpio, int is_input)这个函数是实际要用到的配置gpio输入输出函数*/
108行:/*bank指向gpio_bank_34xx[6]数组里面的某个元素地址*/
109行:_set_gpio_direction(bank, get_gpio_index(gpio), is_input)/*函数参数传递*/
以上分析完如何设置相应gpio输入输出GPIO_OE寄存器
112-142行:同样操作GPIO_SETDATAOUT和GPIO_CLEARDATAOUT寄存器,根据输入的gpio,得到gpio组编号以及组内编号,对应寄存
器里相应位置写入0或者1.
143-161行:/*操作GPIO_DATAIN寄存器,设置输入并读取相应gpio的值*/
159-160行:/*GPIO_DATAIN寄存器中相应gpio位置的值保留*/
下面我们把代码添加到omap3stalker.c文件中,323行和325-332行
运行信息如下:打印出 my gpio out end
相关文章推荐
- Android自定义Layout
- 转载一段关于当今剩女现象的经典好文
- Android开发-将自定义View布局到Layout中并调用
- 测试计划
- java实现快速排序的方法
- STL内存管理
- CF 305C ——Ivan and Powers of Two——————【数学】
- 呵呵,我悄悄的来了~
- 串口IAP实验
- Nodejs 模块
- char、varchar、nchar、nvarchar的区别
- Get和Post的区别
- Investigating A Malicious Attachment Without Reversing
- java中的网络编程
- C#通过ADB和UiAutomator实现对安卓手机的控制(一)
- POJ 2106:Boolean Expressions 计算布尔表达式 - 堆栈
- 标准输入框
- 新手用STS(Spring Tool Suite)和Maven构建一个SpringMVC项目
- 斐波那契数 兔子问题
- C学习笔记(九)结构和其他数据形式