全部博文(395)
分类: 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_con和reg_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;
}