阅读:1763回复:5
请教ARM系统里面的硬件端口的访问方式
大家好:
我有一个ARM系统的DRIVER问题请教,请不吝赐教。 系统是INTEL PXA255处理器的ARM嵌入式系统,CF卡的端口地址是0x1f0,中断是14。 不知道系统映射CF卡端口到APP进程内的VIRTUAL ADDRESS的方法是否合适,我这里的CF DRIVER为流驱动,实现如下: (1)在XXX_INIT过程中注册事务处理PcmciaCallBack() (2)在事件处理的CALLBACK函数PcmciaCallBack(CARD_EVENT EventCode, CARD_SOCKET_HANDLE hSock, PCARD_EVENT_PARMS pParms)参数中的 hSock和pParms在CE_REGISTRATION_COMPLETE时间处理过程中建立进程中VIRTUAL ADDRESS和系统内存地址的映射关系。 代码如下: WinParms.hSocket = m_hSock; WinParms.fAttributes = WIN_ATTR_ENABLED | WIN_ATTR_IO_SPACE; WinParms.uWindowSize = ATA_REG_LENGTH; WinParms.fAccessSpeed = WIN_SPEED_USE_WAIT; m_hPcmcia = (CARD_CLIENT_HANDLE)g_pCardEventParams->Parm1; hATAReg = g_pfnCardRequestWindow(m_hPcmcia, &WinParms); //hATAReg = g_pfnCardRequestWindow((CARD_CLIENT_HANDLE)g_pCardEventParams->Parm1, &WinParms); if ( hATAReg == NULL ) { // 错误处理 g_pfnCardDeregisterClient(m_hPcmcia); return (FALSE); } // // Map the command window now. If this fails we can tell the caller to try // the secondary ATA I/O port range. // // ATA_IO_REG_BASE pATAReg = (PBYTE)g_pfnCardMapWindow(hATAReg,ATA_IO_REG_BASE,ATA_REG_LENGTH,(UINT *)&g_dwMemGran); if(pATAReg != CERR_SUCCESS) { // 错误处理 } else { m_hATAReg = hATAReg; m_pATAReg = pATAReg; } (3)在XXX_READ() 和 XXX_WRITE()中 用READ/WRITE_PORT_UCHAR(m_pATAReg)来访问映射的系统内存 但是上述这样作好像根本访问不到想要访问的端口信息,请赐教,多谢了! |
|
沙发#
发布于:2004-12-22 16:33
你的板子支持kernel debugger吗?建议单步执行进入g_pfnCardRequestWindow看看发生了什么
还有你的CF卡的atrribute memory里的信息可以访问吗?(用cardgetparsedtuple)好像后面cf卡的IO操作也要根据这些配置信息即所谓的tuple。你的“CF卡的端口地址是0x1f0”是根据这个得到的吗? 如果你要操作的是CF IO space里的内容,还要确保卡被置于IO Mode |
|
板凳#
发布于:2004-12-23 09:23
多谢楼上的兄弟了,我的CF CARD的端口地址和IO工作方式是按照CF specification 2.0+的规范定制的具体CF CARD硬件接口部分我不是很熟悉。在驱动中我跳过了CardGetParsedTuple(),直接引用了指定的端口地址。另外使CARD切换到IO MODE好像在驱动里面不需要作什么特殊处理吧?
|
|
地板#
发布于:2004-12-23 11:38
在我接触到的一个CF接口的网卡里,确实是需要向cf卡的Atrribute memory space里的COR寄存器写入一个字节的命令后才能进入IO mode的。
具体是这样的(那是一块ne2000兼容的有线网卡) g_pfnCardMapWindow执行成功后,将cf卡的IO space映射到函数返回值所指向的memory space里(可以在debug的memory window里看到,全是00000)此时并不能读写操作 然后调用cardrequestconfig, 这个函数里向cf卡的Atrribute memory space里的COR寄存器写入0x60(根据从cf卡的Atrribute memory space读出来的CIS信息得到这个0x60),卡就进入了IO mode,控制寄存器里的数据就显示在所映射的memory space里了,可以进行读写操作控制网卡 具体你的卡是不是这样我就不清楚了,希望我说的有所帮助 |
|
地下室#
发布于:2004-12-23 14:29
我在CardMapWindow()成功返回后,接着就执行了下面的操作,也成功了,你所说的修改ATTRIBUTE MEMORY SPACE中的内容应该就是把CardConfigInfo.fInterfaceType设为memory mode and io mode,而且也返回成功了。我想知道的使设置了一下状态后,在CF CARD端是否需要有什么程序。很抱歉,我对CF接口了解的不是太多的。
代码如下: CARD_CONFIG_INFO CardConfigInfo; //Setting the required info for manual configuration CardConfigInfo.hSocket = hSock; CardConfigInfo.fAttributes = CFG_ATTR_IRQ_STEERING; //Enables IRQ steering in the socket controller. CardConfigInfo.fInterfaceType = CFG_IFACE_MEMORY_IO; //Puts the socket controller in memory mode and I/O interface mode CardConfigInfo.uVcc = 33; //Vcc = 3.3V CardConfigInfo.uVpp1 = 33; CardConfigInfo.uVpp2 = 33; CardConfigInfo.fRegisters = CFG_REGISTER_CONFIG | CFG_REGISTER_STATUS | CFG_REGISTER_PIN | CFG_REGISTER_COPY; CardConfigInfo.uConfigReg = 0x7D; //initialize to level mode interrupts CardConfigInfo.uStatusReg = FCR_FCSR_IO_IS_8; //Used by the host to indicate 8-bit-only I/O. CardConfigInfo.uPinReg = 0; CardConfigInfo.uCopyReg = 0; //Requesting configuration for the pc card DWORD dw = g_pfnCardRequestConfiguration((CARD_CLIENT_HANDLE)pCardEventParms->Parm1,&CardConfigInfo); 另外如果方便的话,能否留下其他的在线联系方式,比如QQ什么的。多谢了 :) [编辑 - 12/23/04 by wdsjmg] |
|
5楼#
发布于:2004-12-25 23:15
呵呵,俺也是一介菜鸟啊,逼不得已在pxa250的板子上搞一个CF无线网卡的驱动。现在也是在读写映射IO端口的时候遇上麻烦了解决不了。不知道你在弄的什么卡设备。有兴趣我们多讨论讨论吧,互相借鉴说不定能少走些弯路
QQ6712332 |
|