|
发表于 2009-1-5 15:35:07
|
显示全部楼层
这个问题也困扰了我很久。今天才找到答案。
SPI,ADC,等都是依靠时钟工作的,我们的内核(或boot loader)很可能把他们相应的时钟关闭了以节省能耗。这些单元在没有时钟的情况下是不能工作的,也就不能向里面写内容,只能读取。
在内核里,我们可以读取CLKCON值看其对应的时钟是否被关闭了,如果是则应该打开,这样就可以对寄存器进行读写了!可以参考红色部分
#include <linux/module.h>
#include <asm/io.h>
#include <linux/ioport.h>
#include<linux/kernel.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
unsigned kk;
struct resource *io_ptr;
void *iomem1,*iomem2;
io_ptr=request_mem_region(0x4C00000C,0x10000000,"adc-reg");
if(io_ptr)printk("OK\n");
else printk("Fault\n");
iomem1 =ioremap(0x4C00000C,0x100);
if(!(iomem1))printk("ioremap error\n");
else printk("ioremap ok\n");
mb();
kk=readl(iomem1);
writel(kk|0x8000,iomem1);//开启AD的时钟
mb();
kk=readl(iomem1);
printk(KERN_ALERT"%x\n",kk);
iomem2=ioremap(0x58000000,0x10);
writel(0x45,iomem2);
mb();
kk=readl(iomem2);
printk("%x\n",kk); |
|