02day led灯04_static

#include <linux/module.h>  //MODULE_LICENSE("GPL");
#include <linux/init.h>   //module_init  module_exit
#include <linux/kernel.h>  //printk

#include <linux/io.h>    //ioremap  iounremap
#include <linux/ioport.h>  //request_mem_region
#include <mach/regs-gpio.h>
//针对gpio寄存器的静态映射,在/linux-3.5/arch/arm/plat-samsung/include/plat/map-s5p.h 中定义
//S5P_VA_GPIO2
//


#define LED_REG_BASE 0x110002e0
#define   DEVNAME  "my_led"

/*
静态映射,跟平台有关,

*/


static u32  led_reg;

// #define GPM4CON    (*(volatile  u32  *)led_reg)
// #define GPM4DAT        (*(volatile  u32  *)(led_reg + 4))
#define GPM4CON  (*(volatile u32 *)(S5P_VA_GPIO2 + 0x02e0))
#define GPM4DAT   (*(volatile u32 *)(S5P_VA_GPIO2 + 0x02e4))

static int test_init(void)
{
    int ret = 0;

    printk("%s:%s:%d   init\n", __FILE__, __FUNCTION__, __LINE__);
 //向Linux内核中申请一段地址空间,如果之前已经有了其他的模块对该地址进行了申请,那么本次申请会失败.
//注册成功之后,那么可以在/proc/iomem  看到注册信息
//
    if(!request_mem_region(LED_REG_BASE, 8 , DEVNAME)) {
        printk("request_mem_region  failed\n");
        ret = -1;
        goto err_request_mem_region;
    }

    //所谓的静态映射,是三星4412平台,已经做好的把物理地址,映射到的对应当的虚拟地址,所以此时没必要再调用ioremap函数
    //led_reg = (u32)ioremap(LED_REG_BASE, 8);

    GPM4CON  = (GPM4CON & ~0xffff) | 0x1111;
    GPM4DAT  = (GPM4DAT & ~0xf) | 0b1001;



    return 0;

err_request_mem_region:
    return ret;

}

//卸载
static void test_exit(void)
{
    printk("%s:%s:%d   init\n", __FILE__, __FUNCTION__, __LINE__);

    //释放映射的虚拟地址
    iounmap((void *)led_reg);

    release_mem_region(LED_REG_BASE, 8);
}

module_init(test_init);
module_exit(test_exit);


MODULE_LICENSE("GPL");  //加入GPL许可


posted @ 2017-02-15 12:30  小黑·.·  阅读(126)  评论(0编辑  收藏  举报