工具/软件:Linux
您好!
我使用 mmap()来映射 ULPI 寄存器(0x480648A4),这是 ULPI 寄存器(运行 Linux 的 OMAP35xx)的起点。 如果我不访问任何寄存器、mmap 工作正常。 但是、当我尝试访问或打印我得到的寄存器值时
以下总线错误
未处理的故障:在0x400248a4上的非线性获取(0x1018)上的外部中止
注意:只有在没有此 HRT 功能的情况下在 Linux 中启用 HRT (高分辨率计时器)后、此问题才会出现。以下代码工作正常。
更多信息:
此代码在 OMAP 35xx 的 Cortex A8上运行
我正在使用 CodeSourcery c/c++编译器运行 Linux
在用户空间中运行代码时、它会被占用。
源代码:
int writeUlpiMem( tUlpipBus *ulpiMem)
{
Int FD、RET;
void *map_base、*virt_addr;
unsigned long read_result、writeval;
off_t 目标;
target = ulpiMem->target;
if (((fd = open ("/dev/mem、O_RDWR | O_sync))=-1) fatal;
//printf ("/dev/mem 已打开。\n");
fflush (stdout);
/*映射一页*/
MAP_BASE = mMAP (0、MAP_SIZE、PROT_READ | PROT_WRITE、MAP_SHARED、FD、 Target &~map_mask);
if (map_base =(void *)-1) fatal;
printf ("在地址%p.\n"、map_BASE 映射的内存);
fflush (stdout);
virt_addr = map_BASE +(target & map_mask);
read_result =*((unsigned long *) virt_addr);
printf ("地址0x%X (%p)上的值:0x%X\n"、target、virt_addr、read_result);
fflush (stdout);
//如果发生 HealthCheck、我们不需要向 ULPI 寄存器写入任何值、我们只需从此处读取并返回。
if (ulpiMem->HealthCheck)
{
if (read_result== USB_port_bad)
{
RET = 1;
}
其他
{
RET = 0;
}
}
其他
{
writeval = ulpiMem->writeval;
*((unsigned long *) virt_addr)= writeval;
read_result =*((unsigned long *) virt_addr);
printf ("写入0x%X;回读0x%X\n"、writeval、read_result);
fflush (stdout);
RET = 0;
}
if (munmap (map_BASE、map_size)==1) fatal;
关闭(FD);
回程;
}
提前感谢。