9762|30

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440 加入一个串口驱动导致启动不了,大伙帮忙看看。 [复制链接]

按照http://www.hzlitai.com.cn/bbs/viewthread.php?tid=11487&pid=67161&page=1&extra=#pid67161



提示加入,没有想到在系统启动的时候不停的打印



EvaluateEventFlag (eventMask = 0x80) - device was closed
EvaluateEventFlag (eventMask = 0x40) - device was closed
EvaluateEventFlag (eventMask = 0x2) - device was closed
EvaluateEventFlag (eventMask = 0x80) - device was closed
EvaluateEventFlag (eventMask = 0x40) - device was closed
EvaluateEventFlag (eventMask = 0x2) - device was closed







不知道咋回事,汗。



EvaluateEventFlag 源码在这里,但是我都没有启动完系统,也没有应用去操作它啊。真晕。
/* ****************************************************************
*
* Win32 Comm Api Support follows.
*
* @doc EXTERNAL
*/




// ****************************************************************
//
// @func VOID | EvaluateEventFlag | Evaluate an event mask.
//
// @parm PHW_INDEP_INFO | pHWIHead  | MDD context pointer
// @parm ULONG    | fdwEventMask | Bitmask of events
//
// @rdesc No return
//
// @remark This function is called by the PDD (and internally in the MDD
//   to evaluate a COMM event.  If the user is waiting for a
//     COMM event (see WaitCommEvent()) then it will signal the
//   users thread.
//
VOID
EvaluateEventFlag(PVOID pHead, ULONG fdwEventMask)
{
    PHW_INDEP_INFO  pHWIHead = (PHW_INDEP_INFO)pHead;
    PLIST_ENTRY     pEntry;
    PHW_OPEN_INFO   pOpenHead;
    DWORD           dwTmpEvent, dwOrigEvent;
    BOOL            fRetCode;



    if ( !pHWIHead->OpenCnt ) {
        DEBUGMSG (ZONE_EVENTS|ZONE_ERROR,
                  (TEXT(" EvaluateEventFlag (eventMask = 0x%x) - device was closed\r\n"),fdwEventMask));
        SetLastError (ERROR_INVALID_HANDLE);
        return;
    }



    DEBUGMSG (ZONE_EVENTS, (TEXT(" CommEvent - Event 0x%X, Global Mask 0x%X\r\n"),
                            fdwEventMask,
                            pHWIHead->fEventMask));



    // Now that we support multiple opens, we must check mask for each open handle
    // To keep this relatively painless, we keep a per-device mask which is the
    // bitwise or of each current open mask.  We can check this first before doing
    // all the linked list work to figure out who to notify
    if ( pHWIHead->fEventMask & fdwEventMask ) {
        pEntry = pHWIHead->OpenList.Flink;
        while ( pEntry != &pHWIHead->OpenList ) {
            pOpenHead = CONTAINING_RECORD( pEntry, HW_OPEN_INFO, llist);
            pEntry = pEntry->Flink;  // advance to next



            EnterCriticalSection(&(pOpenHead->CommEvents.EventCS));
            // Don't do anything unless this event is of interest to the MDD.
            if ( pOpenHead->CommEvents.fEventMask & fdwEventMask ) {
                // Store the event data
                dwOrigEvent = pOpenHead->CommEvents.fEventData;                    
                do {
                    dwTmpEvent = dwOrigEvent;
                    dwOrigEvent = InterlockedExchange(&(pOpenHead->CommEvents.fEventData),
                                                      dwTmpEvent | fdwEventMask) ;



                } while ( dwTmpEvent != dwOrigEvent );



                // Signal the MDD that new event data is available.
                fRetCode = SetEvent(pOpenHead->CommEvents.hCommEvent);
                DEBUGMSG (ZONE_EVENTS, (TEXT(" CommEvent - Event 0x%X, Handle 0x%X Mask 0x%X (%X)\r\n"),
                                        dwTmpEvent | fdwEventMask,
                                        pOpenHead,
                                        pOpenHead->CommEvents.fEventMask,
                                        fRetCode));



            }
            LeaveCriticalSection(&(pOpenHead->CommEvents.EventCS));
        }
    }



    return;
}

以前的串口驱动是我移植4.2 的到5.0的,现在发现很多bug想重新弄标准5.0的,就出现如上的问题了。有没有人遇到过?

最新回复

怎么eeworld图片还没有出来呢  详情 回复 发表于 2010-1-24 23:38
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
EvaluateEventFlag 看看哪里call了这函数?函数体看不出来问题。因为已经正确执行了。
要看看call这个函数的地方了。
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
先帮你顶下,吃了饭再来看
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
嗯,按立宇泰论坛上弄的,当年我也是按这个方法弄也没有搞起来,迷茫中......
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

5
 
没遇到过这个问题,友情帮顶!!!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
没有改过 在4.2下倒是改过 都是可以的
当时要改cfw.c  armint.c   oalintra.inc   oalintr.h   oalintr.inc   platform.reg ser2410_hw.c  ser2410_ser.c
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

7
 
楼主的2440支持KITL么,跟踪一下到底从哪里开始导致异常的。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 panzekai 的回复:
嗯,按立宇泰论坛上弄的,当年我也是按这个方法弄也没有搞起来,迷茫中......


我把别的开发板的驱动弄上去,照样是这样,汗死了。
看来这次要深入学习了。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
  1. if ( !pHWIHead->OpenCnt ) {
  2.         DEBUGMSG (ZONE_EVENTS|ZONE_ERROR,
  3.                   (TEXT(" EvaluateEventFlag (eventMask = 0x%x) - device was closed\r\n"),fdwEventMask));
  4.         SetLastError (ERROR_INVALID_HANDLE);
  5.         return;
  6.     }
复制代码


打印的是这个信息,说明这个出错了,郁闷KITL 就会经常导致LCD 白屏,用不了。好像是这个LCD 驱动IC质量不行,只能用最土的方法解决它。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
EvaluateEventFlag (eventMask = 0x80) - device was closed
EvaluateEventFlag (eventMask = 0x40) - device was closed
EvaluateEventFlag (eventMask = 0x2) - device was closed
就3个串口,DeviceArrayIndex=0x2,0x40,0x80,那么你从那个串口打印输出的?
没屏蔽调试串口?
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

11
 
这个问题比较奇怪,帮你顶下!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
再来看看。帮顶下。这个问题很奇怪。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
BOOL CSerialPDD::EventCallback(ULONG fdwEventMask,ULONG fdwModemStatus)
{
    EvaluateEventFlag(m_pMdd,fdwEventMask);
    if (!IsOpen() && ((fdwEventMask & EV_RLSD)!=0 && (fdwModemStatus & MS_RLSD_ON)!=0)) {
        DEBUGMSG (ZONE_EVENTS,
                  (TEXT(" CSerialPDD::EventCallback (eventMask = 0x%x, modemstatus = 0x%x) - device was closed\r\n"),
                  fdwEventMask,fdwModemStatus));
        CeEventHasOccurred (NOTIFICATION_EVENT_RS232_DETECTED, NULL);
    }
RETAILMSG(1, (TEXT("ERROR:  Failed to release sysintr value for uart interrupt.\r\n")));

    return TRUE;
}
呵呵,在这里被调用了。我先看看咋回事。呵呵。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习了,帮GoogleMan顶贴,哈哈…
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
谷歌男换头像了.....- -
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 

  1. #define   EV_RXCHAR                       0x0001     //   Any   Character   received   
  2. #define   EV_RXFLAG                       0x0002     //   Received   certain   character   
  3. #define   EV_TXEMPTY                      0x0004     //   Transmitt   Queue   Empty   
  4. #define   EV_CTS                          0x0008     //   CTS   changed   state   
  5. #define   EV_DSR                          0x0010     //   DSR   changed   state   
  6. #define   EV_RLSD                         0x0020     //   RLSD   changed   state   
  7. #define   EV_BREAK                        0x0040     //   BREAK   received   
  8. #define   EV_ERR                          0x0080     //   Line   status   error   occurred   
  9. #define   EV_RING                         0x0100     //   Ring   signal   detected   
  10. #define   EV_PERR                         0x0200     //   Printer   error   occured   
  11. #define   EV_RX80FULL                          0x0400     //   Receive   buffer   is   80   percent   full   
  12. #define   EV_EVENT1                       0x0800     //   Provider   specific   event   1   
  13. #define   EV_EVENT2                       0x1000     //   Provider   specific   event   2
复制代码

看你的打印信息,出现的事件分别是以下事件:
EV_ERR, EV_BREAK, EV_RXFLAG 80h 40h 2h
我们再来看看cserpdd.cpp以及pdds3c2440_ser.cpp源代码
我们可以看到这3个事件都是在CPdd2440Uart::GetLineStatus()中调用EventCallback()发送出去的..
而唯一能让GetLineStatus()函数反复调用的就是下面这个函数了

  1. ULONG   CPdd2440Uart::ReceiveInterruptHandler(PUCHAR pRxBuffer,ULONG *pBufflen)
  2. {
  3.     DEBUGMSG(ZONE_THREAD|ZONE_READ,(TEXT("+CPdd2440Uart::ReceiveInterruptHandler pRxBuffer=%x,*pBufflen=%x\r\n"),
  4.         pRxBuffer,pBufflen!=NULL?*pBufflen:0));
  5.     DWORD dwBytesDropped = 0;
  6.     if (pRxBuffer && pBufflen ) {
  7.         DWORD dwBytesStored = 0 ;
  8.         DWORD dwRoomLeft = *pBufflen;
  9.         m_bReceivedCanceled = FALSE;
  10.         m_HardwareLock.Lock();
  11.         
  12.         while (dwRoomLeft && !m_bReceivedCanceled) {
  13.             ULONG ulUFSTATE = m_pReg2440Uart->Read_UFSTAT();
  14.             DWORD dwNumRxInFifo = (ulUFSTATE & (0x3f<<0));
  15.             if ((ulUFSTATE & (1<<6))!=0) // Overflow. Use FIFO depth (16);
  16.                 dwNumRxInFifo = SER2440_FIFO_DEPTH_RX;
  17.             DEBUGMSG(ZONE_THREAD|ZONE_READ,(TEXT("CPdd2440Uart::ReceiveInterruptHandler ulUFSTATE=%x,UTRSTAT=%x, dwNumRxInFifo=%X\r\n"),
  18.                 ulUFSTATE, m_pReg2440Uart->Read_UTRSTAT(), dwNumRxInFifo));
  19.             if (dwNumRxInFifo) {
  20.                 ASSERT((m_pReg2440Uart->Read_UTRSTAT () & (1<<0))!=0);
  21.                 while (dwNumRxInFifo && dwRoomLeft) {
  22.                     UCHAR uLineStatus = GetLineStatus();
  23.                     UCHAR uData = m_pReg2440Uart->Read_URXH();
  24.                     if (DataReplaced(&uData,(uLineStatus & UERSTATE_PARITY_ERROR)!=0)) {
  25.                         *pRxBuffer++ = uData;
  26.                         dwRoomLeft--;
  27.                         dwBytesStored++;                    
  28.                     }
  29.                     dwNumRxInFifo --;
  30.                 }
  31.             }
  32.             else
  33.                 break;
  34.         }
  35.         if (m_bReceivedCanceled)
  36.             dwBytesStored = 0;
  37.         
  38.         m_HardwareLock.Unlock();
  39.         *pBufflen = dwBytesStored;
  40.     }
  41.     else {
  42.         ASSERT(FALSE);
  43.     }
  44.     DEBUGMSG(ZONE_THREAD|ZONE_READ,(TEXT("-CPdd2440Uart::ReceiveInterruptHandler pRxBuffer=%x,*pBufflen=%x,dwBytesDropped=%x\r\n"),
  45.         pRxBuffer,pBufflen!=NULL?*pBufflen:0,dwBytesDropped));
  46.     return dwBytesDropped;
  47. }
复制代码

而这个函数是被pdd层的
ULONG HWRxIntrHandler(
  PVOID pContext,
  PUCHAR pTargetBuffer,
  PULONG pByteNumber
); // This function handles serial port interrupts.
函数所调用的, cserpdd.cpp中可以看到他的实现

  1. ULONG
  2. SerRxIntr(
  3.          PVOID pHead,                // @parm Pointer to hardware head
  4.          PUCHAR pRxBuffer,           // @parm Pointer to receive buffer
  5.          ULONG *pBufflen             // @parm In = max bytes to read, out = bytes read
  6.          )
  7. {
  8.     DEBUGMSG (ZONE_READ|ZONE_EVENTS,(TEXT("+SerRxIntr( 0x%X,0x%X,0x%X)\r\n"),
  9.             pHead,pRxBuffer,(pBufflen!=NULL?*pBufflen:0)));
  10.     DWORD dwReturn=0;
  11.     CSerialPDD * pSerialPDD  = ( CSerialPDD * )pHead;
  12.     if (pSerialPDD)
  13.         dwReturn = pSerialPDD->ReceiveInterruptHandler(pRxBuffer,pBufflen);
  14.     DEBUGMSG (ZONE_READ|ZONE_EVENTS,(TEXT("-SerRxIntr( 0x%X,0x%X,0x%X) return 0x%X\r\n"),
  15.             pHead,pRxBuffer,(pBufflen!=NULL?*pBufflen:0),dwReturn));
  16.     return dwReturn;
  17. }
复制代码

LZ查查是不是某种原因导致串口一直在触发中断?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

17
 
多谢楼上,我刚才查找原因。
发现
不止楼上所说的。
很多地方调用了EventCallback,如下:
一、CSerialPDD::SetReceiveError(ULONG ulNewErrors)
二、CPdd2440Uart::GetLineStatus()
三、CSerialPDD::DataReplaced
四、CSerialPDD::SetReceiveError

晕倒,再看。呵呵。好久没有遇到这么大的问题了。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

18
 
DataReplaced 是被ReceiveInterruptHandler()调用的
GetLineStatus是被GetLineStatus调用的..
呵呵
最终都是因为触发了中断引起的..
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 flandy1982 的回复:
DataReplaced 是被ReceiveInterruptHandler()调用的
GetLineStatus是被GetLineStatus调用的..
呵呵
最终都是因为触发了中断引起的..



快了,呵呵。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

20
 
看下,是不是开启红外!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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