zoukankan      html  css  js  c++  java
  • 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 ", __FILE__, __FUNCTION__, __LINE__);
     //向Linux内核中申请一段地址空间,如果之前已经有了其他的模块对该地址进行了申请,那么本次申请会失败.
    //注册成功之后,那么可以在/proc/iomem  看到注册信息
    //
        if(!request_mem_region(LED_REG_BASE, 8 , DEVNAME)) {
            printk("request_mem_region  failed ");
            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 ", __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许可


  • 相关阅读:
    [转]CROSS APPLY 和outer apply 的区别
    第一次WCF部署成功心得(UP+证书)
    .NET 简单实现广播
    【转】 c#注册全局快捷键
    软件人才成长链
    [转]关于VS2005智能设备中无法找到PInvoke DLL问题
    [转]我倡导无政府主义编程—Fred George访谈录
    运行Windows Mobile程序时报错:无法找到 PInvoke DLL SQLite.Interop.065.DLL
    系统分析师考试说明
    [转]Oracle 字符集的查看和修改
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6400904.html
Copyright © 2011-2022 走看看