Linux 中控制 GPIO 点亮 LED 的方法有好几种。一种是使用内核提供的专门用来控制GPIO 的函数来点亮 LED,如:s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]); s3c2410_gpio_setpin(led_table[i], 0);一种是通过 IO 内存猎取硬件地址从而控制 GPIO 来点亮 LED,如:void *ioremap(unsigned long phys_addr, unsigned long size);void ioumap(void *addr);这里主要介绍第二种点亮 LED 方式。1. 理论支撑1.1 IO 内存分配和映射1.1.1 在使用 IO 内存之前首先分配 IO 内存区域。分配和撤销 IO 内存区域使用的函数如下: #include
struct resource *request_mem_region(unsigned long start,unsigned long len,char *name);参数说明:start 分配内存起始地址 len 分配内存长度 返回 成功非 NULL,否则返回 NULL。相应的释放函数: void release_mem_region(unsigned long start,unsigned long len); 1.1.2 在 linux 中不能使用实际的物理地址,要对指定的物理地址进行操作必须先将物理地址映射到虚拟地址中。下面的函数就是实现物理地址到虚拟地址的映射:#include void *ioremap(unsigned long phys_addr, unsigned long size);参数说明:phys_addr 需要访问的物理内存(寄存器)的首地址 size 内存区域大小返回与该段物理地址对应的虚拟地址 相应的撤销映射关系的函数是:void ioumap(void *addr); 1.1.3 使用 IO 内存时,request_mem_region 函数并不是必须的,该函数只是在内核中标志该内存区域已经分配出去,不能再进行分配出去。但是,这不不是说别的驱动不能再使用该 IO 内存。至于能不能使用,分下面 2 种情况: 1. 两个驱动都用 request_mem_region 分配相同的 IO 内存,则两个驱动只能有一个驱动可以使用。 2. 两个驱动只有一个使用了 request_mem_region 函数,那么这两个驱动可以同时使用,并可以同时访问该 IO 内存。 1.2 访问 IO 内存 ioremap 函数的返回值可以直接当做指针(指向对应的物理内存(寄存器)地址)使用,但是这种使用方式不具有可移植性。使用下面的访问 IO 内存的专用函数符合可移植性要求。 从 I/O 内存读取, 使用下列函数之一: unsigned int ioread8(void *addr); unsigned int ioread16(void *addr); unsigned int ioread32(void *addr);参数:addr 是从...