linux驱动,该怎么解决
linux驱动
int emc_value;
static int emc_init(void)
{
emc_value=register_chrdev(0,"emc",&emc_contrl);
if(emc_value<0)
{
printk("emc register failed!\n");
return 0;
}
else
{
printk("emc register sucess!\n");
}
vdpm_start_address=(volatile unsigned long *)ioremap(dpm_start_address,4);
vP2_MUX_CLR =(volatile unsigned long *)ioremap(P2_MUX_CLR,4);
vEMCStatus =(volatile unsigned long *)ioremap(EMCStatus,4);
vEMCConfig =(volatile unsigned long *)ioremap(EMCConfig,4);
vEMCStaticConfig =(volatile unsigned long *)ioremap(EMCStaticConfig,4);
vEMCStaticWaitWen =(volatile unsigned long *)ioremap(EMCStaticWaitWen,4);
vEMCStaticWaitOen =(volatile unsigned long *)ioremap(EMCStaticWaitOen,4);
vEMCStaticWaitRd0 =(volatile unsigned long *)ioremap(EMCStaticWaitRd0,4);
vEMCStaticWaitwr =(volatile unsigned long *)ioremap(EMCStaticWaitwr,4);
vEMCStaticWaitTurn3=(volatile unsigned long *)ioremap(EMCStaticWaitTurn3,4);
vEMCAHBControl0 =(volatile unsigned long *)ioremap(EMCAHBControl0,4);
vEMCAHBControl3 =(volatile unsigned long *)ioremap(EMCAHBControl3,4);
vEMCAHBTimeOut0 =(volatile unsigned long *)ioremap(EMCAHBTimeOut0,4);
vEMCAHBTimeOut3 =(volatile unsigned long *)ioremap(EMCAHBTimeOut3,4);
vEMCAHBControl4 =(volatile unsigned long *)ioremap(EMCAHBControl4,4);
vEMCAHBTimeOut4 =(volatile unsigned long *)ioremap(EMCAHBTimeOut4,4);
vEMCcontrl =(volatile unsigned long *)ioremap(EMCcontrl,4);
printk("emc_init sucess\n");
return 1;
}
static int emc_exit(void)
{
iounmap(vdpm_start_address);
iounmap(vP2_MUX_CLR);
iounmap(vEMCStatus);
iounmap(vEMCConfig);
iounmap(vEMCStaticConfig);
iounmap(vEMCStaticWaitWen);
iounmap(vEMCStaticWaitOen);
iounmap(vEMCStaticWaitRd0);
iounmap(vEMCStaticWaitwr);
iounmap(vEMCStaticWaitTurn3);
iounmap(vEMCAHBControl0 );
iounmap(vEMCAHBControl3);
iounmap(vEMCAHBTimeOut0 );
iounmap(vEMCAHBTimeOut3);
iounmap(vEMCAHBControl4);
iounmap(vEMCAHBTimeOut4);
iounmap(vEMCcontrl);
unregister_chrdev(emc_value,&emc_contrl);
return 1;
}
module_init(emc_init);
module_exit(emc_exit);
MODULE_LICENSE("Dual BSD/GPL");
这个是程序的一部分,我想在加载驱动的时候执行物理地址到虚拟地址的映射,程序那样映射是否合理呢?为什么在裸机下用物理地址操作程序没有问题,但是放了操作系统,把驱动加载进内核,程序没有反应了。
------解决方案--------------------
操作系统有它自己的内存管理机制,在系统初始化的时候已经决定了哪一部分进行虚实转化,哪一部分不进行虚实转化,你完全可以利用操作系统提供的虚实转化接口得到自己想要的虚/实地址.
int emc_value;
static int emc_init(void)
{
emc_value=register_chrdev(0,"emc",&emc_contrl);
if(emc_value<0)
{
printk("emc register failed!\n");
return 0;
}
else
{
printk("emc register sucess!\n");
}
vdpm_start_address=(volatile unsigned long *)ioremap(dpm_start_address,4);
vP2_MUX_CLR =(volatile unsigned long *)ioremap(P2_MUX_CLR,4);
vEMCStatus =(volatile unsigned long *)ioremap(EMCStatus,4);
vEMCConfig =(volatile unsigned long *)ioremap(EMCConfig,4);
vEMCStaticConfig =(volatile unsigned long *)ioremap(EMCStaticConfig,4);
vEMCStaticWaitWen =(volatile unsigned long *)ioremap(EMCStaticWaitWen,4);
vEMCStaticWaitOen =(volatile unsigned long *)ioremap(EMCStaticWaitOen,4);
vEMCStaticWaitRd0 =(volatile unsigned long *)ioremap(EMCStaticWaitRd0,4);
vEMCStaticWaitwr =(volatile unsigned long *)ioremap(EMCStaticWaitwr,4);
vEMCStaticWaitTurn3=(volatile unsigned long *)ioremap(EMCStaticWaitTurn3,4);
vEMCAHBControl0 =(volatile unsigned long *)ioremap(EMCAHBControl0,4);
vEMCAHBControl3 =(volatile unsigned long *)ioremap(EMCAHBControl3,4);
vEMCAHBTimeOut0 =(volatile unsigned long *)ioremap(EMCAHBTimeOut0,4);
vEMCAHBTimeOut3 =(volatile unsigned long *)ioremap(EMCAHBTimeOut3,4);
vEMCAHBControl4 =(volatile unsigned long *)ioremap(EMCAHBControl4,4);
vEMCAHBTimeOut4 =(volatile unsigned long *)ioremap(EMCAHBTimeOut4,4);
vEMCcontrl =(volatile unsigned long *)ioremap(EMCcontrl,4);
printk("emc_init sucess\n");
return 1;
}
static int emc_exit(void)
{
iounmap(vdpm_start_address);
iounmap(vP2_MUX_CLR);
iounmap(vEMCStatus);
iounmap(vEMCConfig);
iounmap(vEMCStaticConfig);
iounmap(vEMCStaticWaitWen);
iounmap(vEMCStaticWaitOen);
iounmap(vEMCStaticWaitRd0);
iounmap(vEMCStaticWaitwr);
iounmap(vEMCStaticWaitTurn3);
iounmap(vEMCAHBControl0 );
iounmap(vEMCAHBControl3);
iounmap(vEMCAHBTimeOut0 );
iounmap(vEMCAHBTimeOut3);
iounmap(vEMCAHBControl4);
iounmap(vEMCAHBTimeOut4);
iounmap(vEMCcontrl);
unregister_chrdev(emc_value,&emc_contrl);
return 1;
}
module_init(emc_init);
module_exit(emc_exit);
MODULE_LICENSE("Dual BSD/GPL");
这个是程序的一部分,我想在加载驱动的时候执行物理地址到虚拟地址的映射,程序那样映射是否合理呢?为什么在裸机下用物理地址操作程序没有问题,但是放了操作系统,把驱动加载进内核,程序没有反应了。
------解决方案--------------------
操作系统有它自己的内存管理机制,在系统初始化的时候已经决定了哪一部分进行虚实转化,哪一部分不进行虚实转化,你完全可以利用操作系统提供的虚实转化接口得到自己想要的虚/实地址.