wdsjmg
驱动牛犊
驱动牛犊
  • 注册日期2001-12-03
  • 最后登录2005-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1763回复:5

请教ARM系统里面的硬件端口的访问方式

楼主#
更多 发布于:2004-12-22 15:36
大家好:
我有一个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)来访问映射的系统内存

但是上述这样作好像根本访问不到想要访问的端口信息,请赐教,多谢了!
happy_life
驱动牛犊
驱动牛犊
  • 注册日期2004-12-22
  • 最后登录2005-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-22 16:33
你的板子支持kernel debugger吗?建议单步执行进入g_pfnCardRequestWindow看看发生了什么

还有你的CF卡的atrribute memory里的信息可以访问吗?(用cardgetparsedtuple)好像后面cf卡的IO操作也要根据这些配置信息即所谓的tuple。你的“CF卡的端口地址是0x1f0”是根据这个得到的吗?

如果你要操作的是CF IO space里的内容,还要确保卡被置于IO Mode
wdsjmg
驱动牛犊
驱动牛犊
  • 注册日期2001-12-03
  • 最后登录2005-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-23 09:23
多谢楼上的兄弟了,我的CF CARD的端口地址和IO工作方式是按照CF specification 2.0+的规范定制的具体CF CARD硬件接口部分我不是很熟悉。在驱动中我跳过了CardGetParsedTuple(),直接引用了指定的端口地址。另外使CARD切换到IO MODE好像在驱动里面不需要作什么特殊处理吧?
happy_life
驱动牛犊
驱动牛犊
  • 注册日期2004-12-22
  • 最后登录2005-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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里了,可以进行读写操作控制网卡

具体你的卡是不是这样我就不清楚了,希望我说的有所帮助
wdsjmg
驱动牛犊
驱动牛犊
  • 注册日期2001-12-03
  • 最后登录2005-07-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
happy_life
驱动牛犊
驱动牛犊
  • 注册日期2004-12-22
  • 最后登录2005-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-25 23:15
呵呵,俺也是一介菜鸟啊,逼不得已在pxa250的板子上搞一个CF无线网卡的驱动。现在也是在读写映射IO端口的时候遇上麻烦了解决不了。不知道你在弄的什么卡设备。有兴趣我们多讨论讨论吧,互相借鉴说不定能少走些弯路

QQ6712332
游客

返回顶部