【发布时间】:2015-10-23 01:35:07
【问题描述】:
我在 Virtex 5 芯片的 microblaze 上运行 Linux。我实际上有两个芯片运行相同的 Linux 代码,但芯片中有不同的 HDL 模块。我正在编写一个驱动程序,我希望能够检测它在哪个芯片上运行并基于它做不同的事情。在驱动程序初始化期间,我尝试从一个芯片上而不是另一个芯片上存在的 HDL 模块读取 ID 寄存器,但在它不存在的芯片上,我得到一个“内核中的数据总线错误异常”模式。'哎呀。有什么方法可以捕获这个异常并继续加载我的驱动程序?
代码如下:
unsigned region;
unsigned long *res;
unsigned int val;
region = request_mem_region( 0x66000000, 100, NULL );
if ( region ) {
res = ioremap( 0x66000000, 100 );
if ( res ) {
val = ioread32( res ); // exception happens here
if ( val == REGID1 )
printk( "we are on chip 1\n" );
else
printk( "we are on chip 2\n" );
iounmap( res );
}
release_mem_region( 0x66000000, 100 );
}
【问题讨论】:
-
您使用的物理地址似乎是错误的。检查您的处理器 i/o 内存映射。验证 cat /proc/iomem 的范围
-
我在问题中说地址不存在,这就是我确定代码运行在哪个芯片上的方式。我需要捕获异常并使用异常发生的事实作为指标。
标签: linux linux-kernel linux-device-driver