0> 环境:
硬件:Tiny4412
软件:linux-3.5内核源码包
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1> 将物理地址动态映射---- > 虚拟地址:
_ _arm_ioremap(unsigned long phys_addr, // 物理起始地址
size_t size, //映射虚拟空间大小,以字节为单位
unsigned int mtype //映射空间权限
);
/linux-3.5/include/asm-generic/sizes.h 中定义了size_t 宏值:
例:#define SZ_1 0x00000001
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
使用:以led为例:
#define GPM4BASE 0x11000000
#define GPM4CON 0x02e0
#define GPM4DAT 0x02e4
unsigned longvir = ioremap(GPM4BASE, SZ_4K); //调用到_ _arm_ioremap( );
tmp = ioread32(vir+GPM4CON); //读数据
iowrite32(tmp, vir+GPM4CON); //写数据
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2> 静态映射:struct map_desc
待解决??????
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3> gpio:参考/linux-3.5/Documentation/gpio.txt
1》/linux-3.5/arch/arm/mach-exynos/include/mach/gpio.h 为Exynos4412的GPIO编了号:
int led1_n = EXYNOS4X12_GPM4(0); //得到编号
2》gpio_is_valid(int number); //判断gpio编号是否合法
3》 gpio_request(led1_n, "led1"); //注册GPIO编号
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
使用:
int gpio_direction_input(unsigned gpio); //设为输入功能
int gpio_direction_output(unsigned gpio, int value); //设为输出功能,并写入值。
int gpio_get_value(unsigned gpio); //读值
void gpio_set_value(unsigned gpio, int value) ; //写值
note:
void gpio_free(unsigned gpio) ; //用完必须释放GPIO资源
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4> 获得中断资源:以key1为例:
1》 int key1_n = EXYNOS4_GPX3(2); //获得GPIO编号
2》 gpio_to_irq(key1_n); //将GPIO号转换为中断号
3》request_irq( ); //注册中断
4》free_irq( ); //释放中断资源