出现的问题:
在IIC调试中,改好驱动后,发现寄存器写入的值和我用寄存器查看助手读出的值不一样,而且是所有的IIC的寄存器写入的值和读出的值都不一样,驱动调试陷入停顿。
问题的原因:
操作寄存器不对,问题的原因在于地址映射不对,但是我查了地址映射的方法和方式和其他的寄存器映射没有差别
解决问题:
在S2440.H中查看寄存器定义时发现:
#define IIC_BASE 0xB1400000 // 54000000
#define IICFIF_PHYS 0x54000000 // physical address of IIC
typedef struct {
unsigned int rIICCON;
unsigned int rIICSTAT;
unsigned int rIICADD;
unsigned int rIICDS;
unsigned int rIICLC;
}IICreg;
当然,以前的寄存器映射都是映射#define IIC_BASE 0xB1400000 // 54000000这个地址
VirtualCopy((PVOID)v_pIICPregs, (PVOID)(IIC_BASE>> 8), sizeof(IICreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)
在IIC驱动调试中也映射的这个地址时,底层寄存器在修改时没有发生变化,证明我映射的地方错了或者是映射的方式错了
用#define IICFIF_PHYS 0x54000000 // physical address of IIC
VirtualCopy((PVOID)v_pIICPregs, (PVOID)(IICFIF_PHYS >> 8), sizeof(IICreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)
这个地址做映射试了一下,发现居然寄存器操作成功。
分析问题:
WINCE地址映射分了两步:
第一步:是在BOOTLOADE里做第一次映射,将0xB1400000的地址映射到0x54000000
第二步:在应用层中,使用VirtualCopy((PVOID)v_pIICPregs, (PVOID)(IIC_BASE>> 8), sizeof(IICreg), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)将地址映射一次,用户便能操作寄存器。
此次出现的问题在于IIC中,第一步没有做,也就是说BOOTLOADE没有将0xB1400000的地址映射到0x54000000,后面第二步我直接在应用层映射0x54000000显然是不行的。
那么我在应用层将0xB1400000做映射解决了这个问题。