3885|6

84

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

100分求助关于SD无线网卡组件添加和WINCE下中断 [复制链接]

各位高手:
    有两个问题要咨询:
1、我的BSP(PXA270)是从WINCE42下升级到WINCE50的(就是把WINCE42下的BSP拿到WINCE50下编译),
   可是做SD卡时发现以前(WINCE42下)的代码不能用,而整个BSP又不支持WINCE50下的kernelIoControl函数,
   所以在做SD卡驱动时(这个驱动用到了public下的代码即MDD层,PDD层参考另外一个WINCE50下的BSP中SDHC的代码)
   我用的代码中原来用到kernelIocontrol的地方我都直接赋的中断号,也就是都改成了静态的方式
改动的地方有两处:
MDD层中(WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\INTEL\PXA27X\SDHC\sdcontrol.c)
原来是:
   if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwSDIOIrq, sizeof(DWORD), &(pHardwareContext->dwSysintrSDMMC), sizeof(DWORD), NULL))
    {...}
    if (!InterruptInitialize (pHardwareContext->dwSysintrSDMMC,
                              pHardwareContext->hControllerInterruptEvent,
                              NULL,
                              0))
                              {...}
我改成:
        pHardwareContext->dwSysintrSDMMC = SYSINTR_SDMMC ;
        if (!InterruptInitialize (pHardwareContext->dwSysintrSDMMC,
                              pHardwareContext->hControllerInterruptEvent,
                              NULL,
                              0))
                              {...}
PDD层
原来是:
         if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwSDCDIrq, sizeof(DWORD), &(dwSysintrCD), sizeof(DWORD), NULL))
             {....}
         if (!InterruptInitialize (dwSysintrCD,
                            hCardInsertInterruptEvent,
                            NULL,
                            0))
        {...}
我改成:直接if (!InterruptInitialize (SYSINTR_MMCCD,
                            hCardInsertInterruptEvent,
                            NULL,
                            0))
现在的现象是:可以识别SD卡和SD无线网卡,但是识别的速度特别慢,大概需要半分钟才能识别和打开,拷贝个文件需要半小时左右,而且等待时不能做其他操作,类似死机!
              请问是否是中断的问题?或者是时钟的问题???

2、我的SD卡驱动就是为了在WINCE5下使用SD的无线网卡,现在能识别无线网卡(虽然很慢),我就安装了无线网卡的驱动,驱动安装完了后发现,可以设置IP地址什么的
            也识别到了无线网卡(任务栏上有个图标),双击这个图标会出现对话框,但是有一个非常重要的对话框居然没有,就是“添加网络、网络连接”的那个对话框没有,
            这样我根本不能跟任何路由或者PC机建立连接。
         
请问做过相关工作的高手:是不是因为缺少组件(我基本已经添加了所有无线网络相关的组件,但是我的板子本身是没有网卡的),还是因为驱动的问题????
谢谢各位
此帖出自WindowsCE论坛

最新回复

各位帮忙看看啊??  详情 回复 发表于 2008-11-18 13:44
点赞 关注
 

回复
举报

90

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
今天活比较多没时间仔细看你的代码,但是如果是像您描述的那种速度的话,你查一下中断号吧,我觉得很有可能是中断冲突,造成的某些IO操作被重复调用造成的速度慢。时钟的问题不是不可能。但是没从您的代码上反映出来。没法下判断。另外如果串口没有其它用途的话打一下LOG,看看主要是阻在什么地方了。
此帖出自WindowsCE论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习一下,说不定那天也得整啊!!!
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
VOID EmptyReceiveFifo(PSDH_HARDWARE_CONTEXT pController,
                      PSD_BUS_REQUEST         pRequest,
                      ULONG                   ByteCount,
                      ULONG                   MaxBytes)
{   
    ULONG   receiveBufferIndex = 0; // receive buffer index
    ULONG MaxBytesToRead;
  
    volatile UCHAR *pMMC_RX_Fifo = (volatile UCHAR *)&(pController->pSDMMCRegisters->rxfifo);
    volatile DWORD *pMMC_RX_FifoDW = (volatile DWORD *)&(pController->pSDMMCRegisters->rxfifo);

    RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:is running !\r\n")));

    if( !IsCardPresent() )
    {
        RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:IsCardPresent return 0 !\r\n")));
        return;
    }

    MaxBytesToRead = MaxBytes - pRequest->HCParam;

    if( ByteCount > MaxBytesToRead )
    {
        ByteCount = MaxBytesToRead;
    }
        // we are touching the block buffer, we must set the process permissions
    SD_SET_PROC_PERMISSIONS_FROM_REQUEST(pRequest)
        {
            // empty the FIFO
                RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:start empty the FIFO!\r\n")));
        while (ByteCount)
                {
          RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:go into while (ByteCount) !\r\n")));        
                        // fill up the receive buffer
            if (receiveBufferIndex < MMC_RXFIFO_SIZE)
                        {
               RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:if (receiveBufferIndex < MMC_RXFIFO_SIZE) !\r\n")));                
                  if( ByteCount >= 4 )
                {
                        // read in the dword from the FIFO
                   RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:ByteCount >= 4!\r\n")));
                    *(DWORD*)(&pController->RcvBuffer[receiveBufferIndex]) = *pMMC_RX_FifoDW;
                    receiveBufferIndex+=4;
                    ByteCount-=4;
                }
                else
                {
                    // read in the byte from the FIFO
                    RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:ByteCount < 4!\r\n")));
                    pController->RcvBuffer[receiveBufferIndex] = *pMMC_RX_Fifo;
                    receiveBufferIndex++;
                    ByteCount--;
                }
                    // check to see if we've read enough
                if ((pRequest->HCParam + receiveBufferIndex) >= MaxBytes)
                                {
                    RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:HCParam + receiveBufferIndex>= MaxBytes,Break!\r\n")));
                                        break;
                }
            }
                else
                {
                 RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:if (receiveBufferIndex >= MMC_RXFIFO_SIZE) !\r\n")));  
                                // receive buffer is full, now transfer the data safely
                PREFAST_SUPPRESS( 12008, "False positive: the buffer access index 'pRequest->HCParam + receiveBufferIndex' is guaranteed to be valid prior to this call" );
                SDPerformSafeCopy(&pRequest->pBlockBuffer[pRequest->HCParam],
                                  pController->RcvBuffer,
                                  receiveBufferIndex);
                    // bump the running count
                pRequest->HCParam += receiveBufferIndex;
                    // reset receive buffer index
                receiveBufferIndex = 0;
            }
        } // while
         RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:break while (ByteCount) !\r\n")));
            // check for any left over data
        if (receiveBufferIndex)
                {
            RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:go into if (receiveBufferIndex)!\r\n")));   
                        // safely copy the data
            SDPerformSafeCopy(&pRequest->pBlockBuffer[pRequest->HCParam],
                              pController->RcvBuffer,
                              receiveBufferIndex);
                // bump the running count
            pRequest->HCParam += receiveBufferIndex;
        }
    } SD_RESTORE_PROC_PERMISSIONS();
    RETAILMSG(1, (TEXT("SDControl.c_EmptyReceiveFifo:break SD_RESTORE_PROC_PERMISSIONS !\r\n")));
}
插入卡之后主要运行这个函数,主要打印我标识的“黑粗体”的信息
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
循环一直在运行这个函数!
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
另外在下面这个函数中:
BOOL CLOCK_IS_ON(PSDH_HARDWARE_CONTEXT pHc)
{
    RETAILMSG(1, (TEXT("SDControl.c_CLOCK_IS_ON : is running !\r\n")));
        if( READ_MMC_REGISTER_DWORD( pHc, MMC_STAT ) & MMC_STAT_CLOCK_ENABLED )
    {
        RETAILMSG(1, (TEXT("SDControl.c_CLOCK_IS_ON : return true !\r\n")));
        return TRUE;
    }
    else
    {
   RETAILMSG(1, (TEXT("SDControl.c_CLOCK_IS_ON : return false !\r\n")));         
     return FALSE;
    }
}
打印了几条(这个函数被调用了N次):
    RETAILMSG(1, (TEXT("SDControl.c_CLOCK_IS_ON : return true !\r\n"))); 、
   也打印了几条:RETAILMSG(1, (TEXT("SDControl.c_CLOCK_IS_ON : return false !\r\n")));
此帖出自WindowsCE论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
各位帮忙看看啊??
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表