基于S3C2440的外扩数据线的操作方式
以DM9000为基础进行设计。
基于CAN SJA1000 的芯片读写方式可参考这个
内存实际地址与映像地址的映射关系表。
//-----------------------------------------------------------------------------------------
//#define PD6710_MEM_BASE_ADDRESS (0xA4000000) //(0x10000000) // nGCS2 (A24 == 0)
//#define PD6710_IO_BASE_ADDRESS (0xA5000000) //(0x11000000) // (A24 == 1)
//以下宏定义是对片选地址的空间进行映像,在应用程序中可以通过此地址进行直接访问
//2009-01-12 gk
#define NGCS0_ADDRESS_BASE 0xA0000000 // 0x00000000
#define NGCS1_ADDRESS_BASE 0xA0800000 // 0x08000000
#define NGCS2_ADDRESS_BASE 0xA4000000 // 0x10000000
#define NGCS3_ADDRESS_BASE 0xA4800000 // 0x18000000
#define NGCS4_ADDRESS_BASE 0xA8000000 // 0x20000000
#define NGCS5_ADDRESS_BASE 0xA8800000 // 0x28000000
#define NGCS6_ADDRESS_BASE 0xAC000000 // 0x30000000
#define NGCS7_ADDRESS_BASE 0xAC800000 // 0x38000000
//#define DMA_BUFFER_BASE 0xAC000000
//#define DMA_PHYSICAL_BASE 0x30000000 // S3C2440X01
//-----------------------------------------------------------------------------------------
驱动程序在操作系统的调度下进行内存操作时,需要严格按照传统的方式进行开辟,
v_CNTmemory = (volatile char*)VirtualAlloc(0, sizeof(1024), MEM_RESERVE, PAGE_NOACCESS);
if (v_CNTmemory == NULL)
{
RETAILMSG (1,(TEXT("v_CNTmemory is not allocated\n\r")));
return TRUE;
}
if (!VirtualCopy((PVOID)v_CNTmemory, (PVOID)NGCS2_ADDRESS_BASE, sizeof(1024), PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG (1,(TEXT("v_CNTmemory is not mapped\n\r")));
return TRUE;
}
虽然可以使用
v_CNTmemory = (volatile char *)NGCS2_ADDRESS_BASE;
进行操作,但时会引起如下异常。
Data Abort: Thread=8f8c8400 Proc=8d7d6160 'device.exe'
AKY=00000005 PC=01db1664(cnt.dll+0x00001664) RA=01db1660(cnt.dll+0x00001660) BVA=a4000000 FSR=0000000d
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13771794/viewspace-553368/ ,如需转载,请注明出处,否则将追究法律责任。