83

帖子

0

TA的资源

一粒金砂(初级)

61
 
也是在仿照16c550的改...
此帖出自WindowsCE论坛
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

62
 
主要看着哪个驱动很不爽,,,,自己搞个。 将来扩展20个的时候照用。。。公用数据线。。
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

63
 
我觉得16550写的不错,你增加一个串口就写一个类就可以实现了。我就这么做了。修改一点就OK了。
此帖出自WindowsCE论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

64
 
正在学习 ,按着程序试一试
此帖出自WindowsCE论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

65
 
引用 20 楼 gooogleman 的回复:
pSerObj->dwIntID = DeviceArrayIndex;  // Only it is useful when set set THREAD_AT_MDD. We use this to transfer DeviceArrayIndex
和我的一样啊,这个就是令人郁闷的地方啊。DeviceArrayIndex值和硬件中断八竿子打不着。


大家如果不能帮我解释上面这个问题,就不要顶了,
或者对串口有疑问再回帖,整天只是“顶”,对大家都没有好处。
此帖出自WindowsCE论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

66
 
今天整了半天,发现这个串口的确比较郁闷。
——————————————————————
在启动阶段,串口MDD层没有信息输出的?我刚才确实验证过了,真是神了,怎么搞的啊?

;=============== UART0 (physical COM1 connector P1) (Serial) ===============
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
   "DeviceArrayIndex"=dword:0
   "Irq"=dword:1c
   "MemBase"=dword:50000000
   "MemLen"=dword:2C
   "InterruptBitsShift"=dword:0 ; UART 0 Interrupt Sub Register shift bit.
   "ISTTimeouts"=dword:200        ; every 512 ticks checking Modem status.
   "Prefix"="COM"
   "Index"=dword:1
   "Dll"="serial_smdk2440.dll"
   "Order"=dword:0
   "Priority"=dword:0
   "Port"="COM1:"
   "DeviceType"=dword:0
   "FriendlyName"=LOC_DISPLAYNAME_COM1
   "Tsp"="unimodem.dll"
   "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
   "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
ENDIF
ENDIF

IF BSP_NOIRDA !
; S2440 IrDA(UART2)
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IRDA2440]
   "DeviceArrayIndex"=dword:1
   "Irq"=dword:f
   "MemBase"=dword:50008000
   "MemLen"=dword:2C
   "InterruptBitsShift"=dword:6 ; UART 2 Interrupt Sub Register shift bit.
   ;"ISTTimeouts"=dword:200        ; every 512 ticks checking Modem status.
   "Prefix"="COM"
   "Index"=dword:4
   "Dll"="serial_smdk2440.Dll"
   "Order"=dword:0
   "Priority"=dword:0
   "Port"="COM4:"
   "DeviceType"=dword:0  ; IRDA modem, 0 -> null modem
   "FriendlyName"=LOC_DISPLAYNAME_RAWIR
   "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
   "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
ENDIF


以debug模式编译,下面的东西都不会打印。
/*
@doc INTERNAL
@func        BOOL | DllEntry | Process attach/detach api.
*
@rdesc The return is a BOOL, representing success (TRUE) or failure (FALSE).
*/
BOOL
DllEntry(
              HINSTANCE   hinstDll,             /*@parm Instance pointer. */
              DWORD   dwReason,                 /*@parm Reason routine is called. */
              LPVOID  lpReserved                /*@parm system parameter. */
              )
{
    if ( dwReason == DLL_PROCESS_ATTACH ) {
        DEBUGREGISTER(hinstDll);
        DEBUGMSG (ZONE_INIT, (TEXT("serial port process attach\r\n")));
                DEBUGMSG( ZONE_INIT | ZONE_WARN,( TEXT( "serial port process attach-wogo\r\n")));
        DisableThreadLibraryCalls((HMODULE) hinstDll);
    }

    if ( dwReason == DLL_PROCESS_DETACH ) {
        DEBUGMSG (ZONE_INIT, (TEXT("process detach called\r\n")));
    }

    return(TRUE);
}

我只是sysgen而已,难道要build and sysgen?

试试吧 。
此帖出自WindowsCE论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

67
 
我无语了,不知道你们是否遇到这种情况。我已经 build and sysgen编译debug 版本的NK了
但是根本不会打印MDD中的 DEBUGMSG 的信息,无语了,怎么搞的啊,貌似我人品还不错啊,别这么折腾我啊。我学习wince绝大多数情况下都会遇到别人遇不到的倒霉事情。哎

我就是想彻底搞明白这个中断到底是怎么回事的。

此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

68
 
if ( dwReason == DLL_PROCESS_ATTACH ) {
        DEBUGREGISTER(hinstDll);
        DEBUGMSG (ZONE_INIT, (TEXT("serial port process attach\r\n")));
DEBUGMSG( ZONE_INIT | ZONE_WARN,( TEXT( "serial port process attach-wogo\r\n")));
        DisableThreadLibraryCalls((HMODULE) hinstDll);
    }

    if ( dwReason == DLL_PROCESS_DETACH ) {
        DEBUGMSG (ZONE_INIT, (TEXT("process detach called\r\n")));
    }

不是条件成立才打印吗?有没有可能是条件不成立直接return了
此帖出自WindowsCE论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

69
 
引用 67 楼 wdw1600 的回复:
if ( dwReason == DLL_PROCESS_ATTACH ) {
        DEBUGREGISTER(hinstDll);
        DEBUGMSG (ZONE_INIT, (TEXT("serial port process attach\r\n")));
DEBUGMSG( ZONE_INIT | ZONE_WARN,( TEXT( "serial port process attach-wogo\r\n")));
        DisableThreadLibraryCalls((HMODULE) hinstDll);
    }

    if ( dwReason == DLL_PROCESS_DETACH ) {
        DEBUGMSG (ZONE_INIT, (TEXT("process detach…


这个都不成立,串口绝对打不开。还有我在别处都加了信息。我觉得不知道是哪里限定死了。真是郁闷。
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

70
 
那在这个地方ZONE_INIT的值会不会是0,这样也不会打印,其他地方可以打印这里不能有点古怪呢。
此帖出自WindowsCE论坛
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

71
 
引用 69 楼 wdw1600 的回复:
那在这个地方ZONE_INIT的值会不会是0,这样也不会打印,其他地方可以打印这里不能有点古怪呢。


古怪的事情太多了,原因就是咱们是新手,经验不足。注定要经历这些过程。刚才SHIP_BUILD这个环境变量设置成0就出来了。

哈哈,真是相当好玩啊。
并且我根据打印信息,把这个串口中断的疑问自己解决了,折腾了一天,不停的改变编译方式,终于把信息弄出来了。现在可以展开串口移植了。
此帖出自WindowsCE论坛
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(初级)

72
 
老习惯,解决问题就公布原因:

我一直以为GetSerialObject中的pSerObj->dwIntID = DeviceArrayIndex;和MDD的线程绑定了,其实并不是这样。因为
GetSerialObject中有个重要东西我忽略了,就是pSerObj->BindFlags = THREAD_IN_PDD;
在com_init中有
if ( pSerialHead->pHWObj->BindFlags & THREAD_AT_INIT ) {
        // Hook the interrupt and start the associated thread.
        if ( ! StartDispatchThread( pSerialHead ) ) {
            // Failed on InterruptInitialize or CreateThread.  Bail.
            COM_Deinit(pSerialHead);
            return(NULL);        
        }

    }
上面这个if语句 使StartDispatchThread并没有被调用,如果在这个时候启动了就不得了,一系列线程启动了,而此时仅仅是加载串口驱动而已,并没有使用串口驱动,所以没有得到执行是合理的,后面我看到StartDispatchThread在COM_Open函数中得到了执行,非常合理
现在附上重要代码。
// Initialize hardware dependent data.其实是获得那个串口
    pSerialHead->pHWObj = GetSerialObject( DevIndex );

————————————————GetSerialObject源码————————————————————


// GetSerialObj : The purpose of this function is to allow multiple PDDs to be
// linked with a single MDD creating a multiport driver.  In such a driver, the
// MDD must be able to determine the correct vtbl and associated parameters for
// each PDD.  Immediately prior to calling HWInit, the MDD calls GetSerialObject
// to get the correct function pointers and parameters.
//
extern "C" PHWOBJ
GetSerialObject(
               DWORD DeviceArrayIndex
               )
{
    PHWOBJ pSerObj;

    // Unlike many other serial samples, we do not have a statically allocated
    // array of HWObjs.  Instead, we allocate a new HWObj for each instance
    // of the driver.  The MDD will always call GetSerialObj/HWInit/HWDeinit in
    // that order, so we can do the alloc here and do any subsequent free in
    // HWDeInit.
    // Allocate space for the HWOBJ.
    pSerObj=(PHWOBJ)LocalAlloc( LPTR ,sizeof(HWOBJ) );
    if ( !pSerObj )
        return (NULL);

    // Fill in the HWObj structure that we just allocated.

    pSerObj->BindFlags = THREAD_IN_PDD;     // PDD create thread when device is first attached.
    //——这个pSerObj->dwIntID 在线程中用到,奇怪的是怎么会是注册表DeviceArrayIndex的值呢?
    pSerObj->dwIntID = DeviceArrayIndex;   // Only it is useful when set set THREAD_AT_MDD. We use this to transfer DeviceArrayIndex
    pSerObj->pFuncTbl = (HW_VTBL *) &IoVTbl; // Return pointer to appropriate functions

    // Now return this structure to the MDD.
    return (pSerObj);
}
此帖出自WindowsCE论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

73
 
信息是打印出来了。

但是这个串口驱动有点神经质,不该执行的函数他也执行了。怎么会这样呢?

SerialEventHandler怎么可能执行呢?更不可思议的是COM_READ: returning 0 (total 12, dropped 0,0)
+COM_IOControl(0x8A69D0, 1769524, 0x0, 0, 0x698FC10, 4, 0x698FBFC)
这些,没有使用应用程序去调用它怎么可能执行呢,怎么搞的啊
下面是一部分信息,这样系统不慢才怪呢
Top of Loop Fifo(R=12,W=12,L=2048,BA=0)
About to wait 293ms
+SerialEventHandler, pHead 0x38130
SerialEventHandler, Interrupts 0x8
Other Event, it:8
SerialEventHandler, No Interrupt.
-SerialEventHandler, Fifo(R=0,W=0,L=2048)
ReceiveBytes exiting
-COM_READ: returning 0 (total 12, dropped 0,0)
+COM_IOControl(0x8A69D0, 1769524, 0x0, 0, 0x698FC10, 4, 0x698FBFC)
IOCTL_SERIAL_GET_MODEMSTATUS
-COM_IOControl Success Ecode=87 (len=4)
+COM_IOControl(0x8A6980, 1769552, 0x0, 0, 0x698FC54, 28, 0x698FC38)
IOCTL_SERIAL_GET_DCB
-COM_IOControl Success Ecode=87 (len=28)
+COM_IOControl(0x8A6980, 1769556, 0x698FC54, 28, 0x0, 0, 0x698FC40)
IOCTL_SERIAL_SET_DCB
-COM_IOControl Success Ecode=87 (len=377728)
+COM_IOControl(0x8A69D0, 1769512, 0x698FC40, 4, 0x0, 0, 0x698FC2C)
IOCTL_SERIAL_SET_WAIT_MASK 0x20
SetWaitMask - handle x8A69D0 mask x20
SetWaitMask - handle x8A6980 mask x1F9
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

74
 
pSerObj->dwIntID = DeviceArrayIndex 这个是用来创建 MDD 层接口的,跟中断毫无关系。不同的 pSerObj->dwIntID = DeviceArrayIndex 为每一个窗口创建一个 MMD 层和 IST 线程,真正的中断号在注册表配置项里面。
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

75
 
串口全部是空载了怎么搞的?真是郁闷事情哦
此帖出自WindowsCE论坛
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

76
 
引用 73 楼 xajhuang 的回复:
pSerObj->dwIntID = DeviceArrayIndex 这个是用来创建 MDD 层接口的,跟中断毫无关系。不同的 pSerObj->dwIntID = DeviceArrayIndex 为每一个窗口创建一个 MMD 层和 IST 线程,真正的中断号在注册表配置项里面。


我觉得这个有问题,这个并不是中断怎么弄使用

if ( !InterruptInitialize(pSerialHead->pHWObj->dwIntID,
                              pSerialHead->hSerialEvent,
                              NULL,
                              0) ) {
        DEBUGMSG(ZONE_INIT | ZONE_ERROR,
                 (TEXT("Error initializing interrupt\n\r")));
        return(FALSE);
    }
呢?!
这个InterruptInitialize适合硬件相关的啊。还有上面无端不停的执行那些不该执行的函数,简直是乱来的。一个一个不符合逻辑的事情出现了。
此帖出自WindowsCE论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

77
 
今天下班迟了点,篮球场被人占了。无精打采的走在路上,突然想起这个MDD中断的事情,无意间意识到这个MDD线程启动是靠PDD线程来带动的,其实这样已经获得了成功了。

只是我一直相信网上大家的文章介绍,陷入了 泥塘。其实这个PDD的线程已经完成调用MDD的功能。

哈哈,一切尽在掌握之中。明天写个博客吧。哈哈,今天尝试了驱动调试助手,真是爽呆了,以后不再下载内核了。

非要在那里找个什么中断号出来,其实它根本没有被执行
此帖出自WindowsCE论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

78
 
哈哈,有个牛人也和我的想法一致,他已经完成这个工作了。

dreamzqw      2009年02月15日 11点07分42秒 说:
注意后面的注释
pSerObj->BindFlags = THREAD_IN_PDD; // PDD create thread when device is first attached.
pSerObj->dwIntID = DeviceArrayIndex; // Only it is useful when set set THREAD_AT_MDD. We use this to transfer DeviceArrayIndex

pSerObj->dwIntID = DeviceArrayIndex;只是在线程在MDD层创建时才用到,但pSerObj->BindFlags = THREAD_IN_PDD,实际上线程是在PDD层创建的。

在MDD层的初始化函数和打开函数中有
if ( pSerialHead->pHWObj->BindFlags & THREAD_AT_INIT ) {
// Hook the interrupt and start the associated thread.
if ( ! StartDispatchThread( pSerialHead ) ) {

也就是说要 pSerialHead->pHWObj->BindFlags 的THREAD_AT_INIT位为1才会在这里创建IST,但此时的THREAD_AT_INIT = THREAD_IN_PDD,因此,StartDispatchThread不会被调用,IST不是在这里创建的,那么后面的启动MDD线程
InterruptInitialize(pSerialHead->pHWObj->dwIntID,
pSerialHead->hSerialEvent,
NULL,
0) )
dreamzqw      2009年02月15日 11点09分03秒 说:
也不会调用,真的的IST线程是在PDD层创建的,InterruptInitialize也是在PDD层调用的,中断号是PDD层从注册表读出来的。你看PDD层的
BOOL CPdd16550::Init()
{
if ( CSerialPDD::Init() && IsKeyOpened() && m_XmitFlushDone!=NULL) {
// IST Setup .
DDKISRINFO ddi;
if (GetIsrInfo(&ddi)!=ERROR_SUCCESS) {
return FALSE;
}
m_dwSysIntr = ddi.dwSysintr;
if (m_dwSysIntr != MAXDWORD && m_dwSysIntr!=0 )
m_hISTEvent= CreateEvent(0,FALSE,FALSE,NULL);

if (m_hISTEvent!=NULL) {
if (!InterruptInitialize(m_dwSysIntr,m_hISTEvent,0,0)) {
m_dwSysIntr = MAXDWORD ;
return FALSE;
}
}
PDD层的IST在哪创建的你自己去分析,这个地方比较隐密,要花点时间的,等你找到了,串口驱动就全搞明白了。

请问你是哪位,我们认识吗
gooogleman      2009年02月15日 13点04分13秒 说:
谢谢你的回复。我前几天打球突然想起这个原因,真是惭愧,我陷入了老的思维。4.2BSP就是在MDD创建了。

  
此帖出自WindowsCE论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

79
 
学习啊,现在正在弄2440串口,烦啊
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

80
 

诚聘winCE软件工程师

我司是专业上网本、UMPC、MID方案设计公司,因项目需要现诚聘winCE精英。

职务要求:
大专以上学历;
1年以上winCE软件开发经验;
熟悉winCE6.0系统定制开发者优先;
熟悉三星6410方案者优先;
待遇面谈,看工作经验5K-10K;

联系人:李生
电话:0755-26972802
QQ:68848678
工作地址:深圳南山科技园


此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

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
    快速回复 返回顶部 返回列表