Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2296016
  • 博文数量: 395
  • 博客积分: 10994
  • 博客等级: 上将
  • 技术积分: 5586
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 19:49
文章存档

2014年(1)

2013年(10)

2012年(74)

2011年(303)

2010年(7)

分类: LINUX

2011-09-26 16:10:08

小弟在淘宝上开了个手机冲值的店铺,生意不是很好,希望如果你在我的博客中受益的话,话费不多的话,可以在我这充值(有点淘宝知识的话都知道这个一点钱也转不了),谢谢了:,赚个信誉


下面的地址映射是学习驱动时最基本的方法,不过我也是才学会的,呵呵,我只是列举了驱动中的一个函数的实现。

 

static void __iomem *reg_con; //原型

static unsigned int reg_dat;

static int __init uda1341_init(void)

{

//下面这个ioremap(a,b)的使用很经典,这是我在这个公司学到的相当好的一个接口函数的使用。

//意思是把a这个具体对应于cpu寄存器的地址转换成linux下的虚拟的地址,然后后面的这个24,就是你连续申请24

//比如说你想把0xe0200060转换成虚拟地址,那么总共使用0xe0200060+24个地址,相当于你使用了后面的24个对应的寄存器地址

//一般也够用了(比如对于下面的情况,就是对gpio相关的一组寄存器进行设置,24个已经够了)

       u8 data=0;

       reg_con = ioremap(T_GPC0_CON,24);  //reg_con保存的是申请的虚拟地址后得到的首地址,后面对寄存器的操作就可以通过这个reg_con了。

       reg_dat = (unsigned int)reg_con + 4; //虽然reg_conreg_dat类型不一样,但是都是表示地址,不信,你可以验证一下

       uda1341_gpio_init(); //主要看这个gpio函数,这里面用到了对gpio操作的虚拟地址过程

//下面这部分可以不管

       //setclk(1);

       //setmode(1);

       //setdat(1);

 

       uda1341_boost = 0;

       uda_sampling = DATA2_DEEMP_NONE;

 }

 

static int __init uda1341_gpio_init(void)

{

           unsigned int reg_pud;

         u32 pup;

        reg_pud = (unsigned int)reg_con + 8;  //从这可以看出,已经使用了上面的 reg_con了。

 

        pup=read_l(reg_con);

        pup &= 0xfffff000;

        pup |= 0x00000111;

        write_l(pup,reg_con);

 

        pup = read_l(reg_pud);

        pup &= 0xfffffccc;

        write_l(pup,reg_pud);

 

          return 0;

}

 

 

还有一些函数:

static unsigned int read_l (unsigned int ptr)

{

       return *((volatile unsigned int *)ptr);

}

 

 

static void write_l(unsigned int value, unsigned int ptr)

{

       *((volatile unsigned int *)ptr) = value;

}

阅读(1295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~