4953|14

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

开帖专门讨论ce5.0下扩展16c550的问题(在做这个的朋友大家多多发言阿) [复制链接]

最近在做wince5.0下扩展串口的驱动,现在想用ce5.0微软提供的串口驱动,移植到AT9261上,即
%_WINCEROOT%\Public\Common\Oak\Drivers\Serial\COM16550.代码看过了.
现在问题是:
1,我要将它改成自己的串口驱动用,看完代码后似乎觉得只用做一些寄存器的配置,总线映射,物理地址转换为虚拟地址,中断转化,但是这个工作在那里做?是否在HWInit中做?哪HWOpen中用不用作这样的工作?
2,在4.2中GetSerialObject根据DeviceArrayIndex创建串口对象,即HWInit函数指针调用SerInit,然后CreateSerialObject,问题是这个怎么实现为每个串口分配资源的?
3,还有注册表中的IRQ地址 是十六进制的么?是系统中断还是物理中断?我看到有的注册表中给了SYS_INTERRUPT的地址。有的是IRQ
4,还有这个IOBase 我按照手册上的地址总是不对 4.2的,这个怎么得来的?按照总线地址计算么?似乎感觉不对啊!

一直做应用的,这周接手搞这个,都星期四了,还没眉目,急啊我。欢迎大家讨论

最新回复

借宝地一用 想问gooogleman个问题,你在ce5.0下的2440板子上,移植16550的驱动就是直接用微软的那个dll,然后通过修改注册表中的内容就实现了吗? 我也在做这个东西,把微软的代码拷贝一份出来后,加入bsp中后,编译有错,是WINCETARGETFILE0的问题,注释了这个后就不能生成dll了,正郁闷在这里,不知道我的路走的对不对。 呵呵,给个提示吧   详情 回复 发表于 2009-6-4 17:01
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看完4.2的很清楚,不知道有没有朋友做过? 平台不是2440是9261
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这是微软给ce5.0的 init函数

  1. PVOID
  2. SerInit(
  3.        ULONG   Identifier, // @parm Device identifier.
  4.        PVOID   pMddHead,   // @parm First argument to mdd callbacks.
  5.        PHWOBJ  pHWObj      // @parm Pointer to our own HW OBJ for this device
  6.        )
  7. {
  8.     DEBUGMSG (ZONE_CLOSE,(TEXT("+SerInit, 0x%X\r\n"), Identifier));
  9.     CSerialPDD * pSerialPDD = NULL;
  10.     if (pHWObj) {
  11.         DWORD dwIndex= pHWObj->dwIntID;
  12.         pHWObj->dwIntID = 0;
  13.         pSerialPDD = CreateSerialObject((LPTSTR)Identifier,pMddHead, pHWObj,dwIndex);
  14.     }
  15.     if (pSerialPDD==NULL) {
  16.         ASSERT(FALSE);
  17.         LocalFree(pHWObj);
  18.     }
  19.     DEBUGMSG (ZONE_CLOSE,(TEXT("-SerInit, 0x%X\r\n"), pSerialPDD));
  20.     return pSerialPDD;
  21. }
复制代码

]
这是4.2移植到5.0的代码

  1. static
  2. PVOID
  3. SerInit(
  4.         BOOL bIR,
  5.        ULONG   Identifier, // @parm Device identifier.
  6.        PVOID   pMddHead,   // @parm First argument to mdd callbacks.
  7.        PHWOBJ  pHWObj      // @parm Pointer to our own HW OBJ for this device
  8.        )
  9. {
  10.         PSER_INFO                        pHWHead;

  11. #ifdef EXAMINE_BOOTARGS   
  12.         PVOID                                *ppBootArgs     = NULL;  // Pointer to pointer to bootargs.
  13.         PHYSICAL_ADDRESS        PhysicalAddress = {0,0};
  14. #endif   

  15.         // Note on defaults.  While the PC typcially considers COM1 to be at
  16.         // 3F8, irq4 and COM2 to be 2F8, irq3, NKPC uses COM1 internally for the
  17.         // debugger.  So, when NK tells me to start "COM1" it really means the
  18.         // first one that's available, which is what the PC calls COM2.  Confused?
  19.         // The end result is that COM1 on NK is what the PC considers to be COM2.
  20.         // But wait, there's more.  On a Puzzle, the debugger is on COM2 and the
  21.         // COM1 for NK is ACTUALLY COM1.  So PCs need 2F8 for their port base
  22.         // and Puzzles need 3F8.

  23.         RETAILMSG(DEBUGMODE, (TEXT("SerInit - !!! \r\n")));

  24.         // Allocate for our main data structure and one of it's fields.
  25.         pHWHead = (PSER_INFO)LocalAlloc( LMEM_ZEROINIT|LMEM_FIXED,        sizeof(SER_INFO) );
  26.         if ( !pHWHead )
  27.                 return( NULL );
  28.         RETAILMSG(DEBUGMODE, (TEXT("SerInit 1- !!! \r\n")));
  29.         if ( ! Ser_GetRegistryData(pHWHead, (LPCTSTR)Identifier) )
  30.         {
  31.         RETAILMSG(DEBUGMODE, (TEXT("SerInit2 - !!! \r\n")));
  32.                 DEBUGMSG (ZONE_INIT|ZONE_ERROR,        (TEXT("SerInit - Unable to read registry data.  Failing Init !!! \r\n")));
  33.                 goto ALLOCFAILED;
  34.         }
  35. RETAILMSG(DEBUGMODE, (TEXT("SerInit 3- !!! \r\n")));
  36.         pHWHead->pBaseAddress = Ser_InternalMapRegisterAddresses(pHWHead->dwIOBase, pHWHead->dwIOLen);

  37. #ifdef EXAMINE_BOOTARGS        
  38.         // Allocate a pointer to our bootargs since they may indicate that we don't have
  39.         // access to the hardware resource.

  40.         // First, map the bootargs pointer itself.  Note that I'm reading/writing
  41.         // directly on the physical address.  I can do this since I know this is CEPC and
  42.         // know the adress is not in IO space.  For OEM platforms you would want to do
  43.         // HalTranslateBusAddress first.
  44.         PhysicalAddress.LowPart = BOOT_ARG_PTR_LOCATION & ~0x80000000;
  45. RETAILMSG(DEBUGMODE, (TEXT("SerInitxxx - !!! \r\n")));
  46.         if ( ppBootArgs = MmMapIoSpace(PhysicalAddress, sizeof( PVOID ), TRUE ) )
  47.         {
  48.                 DEBUGMSG (ZONE_INIT, (TEXT("SerInit - ppBootArgs (%X) at %X\r\n"), PhysicalAddress.LowPart, ppBootArgs ));
  49.         }
  50.         else
  51.         {
  52.         RETAILMSG(DEBUGMODE, (TEXT("SerInit 22222- !!! \r\n")));
  53.                 DEBUGMSG (ZONE_INIT | ZONE_ERROR, (TEXT("SerInit - ppBootArgs failure at %X\r\n"), PhysicalAddress.LowPart ));
  54.                 goto ALLOCFAILED;
  55.         }
  56. RETAILMSG(DEBUGMODE, (TEXT("SerInit 11111- !!! \r\n")));
  57.         // Now map the bootargs structure itself
  58.         PhysicalAddress.LowPart = (DWORD) *ppBootArgs;
  59.         if ( pHWHead->pBootArgs = MmMapIoSpace(PhysicalAddress, sizeof(BOOT_ARGS), TRUE ) )
  60.         {
  61.                 DEBUGMSG (ZONE_INIT, (TEXT("SerInit - pBootArgs (%X) at %X\r\n"), PhysicalAddress.LowPart, pHWHead->pBootArgs ));
  62.         }
  63.         else
  64.         {
  65.                 DEBUGMSG (ZONE_INIT | ZONE_ERROR, (TEXT("SerInit - pBootArgs failure at %X\r\n"), (DWORD)PhysicalAddress.LowPart));
  66.                 goto ALLOCFAILED;
  67.         }

  68.         // We no longer need ppBootArgs
  69.         MmUnmapIoSpace( ppBootArgs, sizeof(PVOID) );
  70. #endif // EXAMINE_BOOTARGS
  71. RETAILMSG(DEBUGMODE, (TEXT("SerInit4 - !!! \r\n")));
  72.         pHWHead->pMddHead     = pMddHead;
  73.         pHWHead->pHWObj = pHWObj;
  74.         pHWHead->cOpenCount   = 0;

  75.         RETAILMSG(DEBUGMODE,(TEXT("SerInit - IRQ %d = SYSINTR %d\r\n"),
  76.                                         pHWHead->dwIRQ, pHWHead->pHWObj->dwIntID));

  77.         // Set up our Comm Properties data   
  78.         pHWHead->CommProp.wPacketLength       = 0xffff;
  79.         pHWHead->CommProp.wPacketVersion     = 0xffff;
  80.         pHWHead->CommProp.dwServiceMask      = SP_SERIALCOMM;
  81.         pHWHead->CommProp.dwReserved1         = 0;
  82.         pHWHead->CommProp.dwMaxTxQueue        = 16;
  83.         pHWHead->CommProp.dwMaxRxQueue        = 16;
  84.         pHWHead->CommProp.dwMaxBaud       = BAUD_115200;
  85.         pHWHead->CommProp.dwProvSubType      = PST_RS232;
  86.         pHWHead->CommProp.dwProvCapabilities =
  87.                 PCF_DTRDSR | PCF_RLSD | PCF_RTSCTS |
  88.                 PCF_SETXCHAR |
  89.                 PCF_INTTIMEOUTS |
  90.                 PCF_PARITY_CHECK |
  91.                 PCF_SPECIALCHARS |
  92.                 PCF_TOTALTIMEOUTS |
  93.                 PCF_XONXOFF;
  94.         pHWHead->CommProp.dwSettableBaud      =
  95.                 BAUD_075 | BAUD_110 | BAUD_150 | BAUD_300 | BAUD_600 |
  96.                 BAUD_1200 | BAUD_1800 | BAUD_2400 | BAUD_4800 |
  97.                 BAUD_7200 | BAUD_9600 | BAUD_14400 |
  98.                 BAUD_19200 | BAUD_38400 | BAUD_56K | BAUD_128K |
  99.                 BAUD_115200 | BAUD_57600 | BAUD_USER;
  100.         pHWHead->CommProp.dwSettableParams    =
  101.                 SP_BAUD | SP_DATABITS | SP_HANDSHAKING | SP_PARITY |
  102.                 SP_PARITY_CHECK | SP_RLSD | SP_STOPBITS;
  103.         pHWHead->CommProp.wSettableData       =
  104.                 DATABITS_5 | DATABITS_6 | DATABITS_7 | DATABITS_8;
  105.         pHWHead->CommProp.wSettableStopParity =
  106.                 STOPBITS_10 | STOPBITS_20 |
  107.                 PARITY_NONE | PARITY_ODD | PARITY_EVEN | PARITY_SPACE |
  108.                 PARITY_MARK;

  109.         pHWHead->fIRMode = bIR;
  110.         pHWHead->s2440COM.UseIrDA = bIR;

  111. #ifdef EXAMINE_BOOTARGS
  112.         // Don't actually init the hardware if it is being used for debugging
  113.         if ( ((pHWHead->pBootArgs->ucComPort == 1) && (pHWHead->dwIOBase == COM1_BASE)) ||
  114.                 ((pHWHead->pBootArgs->ucComPort == 2) && (pHWHead->dwIOBase == COM2_BASE)) ||
  115.                 ((pHWHead->pBootArgs->ucComPort == 3) && (pHWHead->dwIOBase == COM3_BASE)) ||
  116.                 ((pHWHead->pBootArgs->ucComPort == 4) && (pHWHead->dwIOBase == COM4_BASE)) ) {
  117.                 DEBUGMSG (ZONE_INIT|ZONE_ERROR, (TEXT("\r\nSerInit - Skipping hardware init of debug port\r\n\r\n")));        
  118.         } else
  119. #endif
  120.         {
  121.                 DEBUGMSG (ZONE_INIT|USERDBG, (TEXT("SerInit - Init 16550 data\r\n")));
  122.                 SL_Init( pHWHead, pHWHead->pBaseAddress, 1,
  123.                                 EvaluateEventFlag, pMddHead, (PLOOKUP_TBL)&BaudTable);
  124.                 DEBUGMSG (ZONE_INIT,
  125.                         (TEXT("SerInit - Disabling UART Power\r\n")));
  126.                 SerSetOutputMode(pHWHead, FALSE, FALSE );   
  127.         }

  128.         return (pHWHead);

  129.         ALLOCFAILED:
  130.         if ( pHWHead->pBaseAddress )
  131.                 VirtualFree(pHWHead->pBaseAddress, 0, MEM_RELEASE);
  132.         if ( ppBootArgs )
  133.                 MmUnmapIoSpace( ppBootArgs, sizeof( PVOID ) );
  134.         if ( pHWHead->pBootArgs )
  135.                 MmUnmapIoSpace( pHWHead->pBootArgs, sizeof(BOOT_ARGS) );

  136.         LocalFree(pHWHead);
  137.         return (NULL);
  138. }

复制代码

明显思路很清楚。。。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
GOOGLEMAN已经搞定了
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
微软写好了,移动到BSP下,加个注册表就可以了。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 xqhrs232 的回复:
GOOGLEMAN已经搞定了

他也是把4.2的移植过来的,在2440的5.0上。这个问题不但。现在想用微软提供的。我到国外网上翻论坛的时候他们都说微软提供的这个很稳定。
铁了心了,要把它移植到9261上。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 gooogleman 的回复:
微软写好了,移动到BSP下,加个注册表就可以了。

我觉得也是这样,不要再SerInit种作点工作么?还有这个IObase 的东东?是16进制么?怎么算,如果接到地址总线上。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Serial]
    "SysIntr"=dword:13
    "Irq"=dword:3
    "IoBase"=dword:02F8
    "IoLen"=dword:8
    "DeviceArrayIndex"=dword:0
    "Prefix"="COM"
    "Dll"="Com16550.Dll"
    "Order"=dword:0
    "Priority"=dword:0
    "IsrDll"="isr16550.dll"
    "IsrHandler"="ISRHandler"
这是pb help中的注册表.
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

9
 
注册表的东西都是16进制
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
郁闷今天又被调去做应用了.
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 papapa123123 的回复:
郁闷今天又被调去做应用了.


应用好,项目变化快,项目奖金才多。

俺们公司也想安排我去做应用,但是我不愿意,他就不强逼了。

我现在把一些驱动移植,或者修改到新产品上了,

貌似公司一点都不着急。很多应用软件都是和GPS/GIS导航相关的,我想测试一下。但是他说不着急。

我是众多同学当中最自由,最轻松的了。

你什么公司啊,怎么会这样啊,做摇摆人对自己和公司都是非常不利的,不会是两三个人搞研发的那种吧。
 
 
 

回复

97

帖子

0

TA的资源

一粒金砂(初级)

12
 
呵呵 偶也是搞GPS和GIS相关的 不过还有GPRS WIFI ZIGBEE呵呵。。

不是被调来调去,是公司想在另一款工业级别的ARM上形成基础平台,刚好手上没事作了,经理就让做前期的预研!现在又立了项目了,就让撤出来了。
有空我会把这个移植好的,再写总结吧:)
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
刚在wince6.0上调通了16550,回答你的问题。
1,我要将它改成自己的串口驱动用,看完代码后似乎觉得只用做一些寄存器的配置,总线映射,物理地址转换为虚拟地址,中断转化,但是这个工作在那里做?是否在HWInit中做?哪HWOpen中用不用作这样的工作?
    答:这些只需要设置注册表项就可以完成
        "Irq"=dword:40                               
        "IOBase"=dword:7F005C00

2,在4.2中GetSerialObject根据DeviceArrayIndex创建串口对象,即HWInit函数指针调用SerInit,然后CreateSerialObject,问题是这个怎么实现为每个串口分配资源的?

答:在驱动加载时会分别调用4个串口dll分配四个串口的资源。

3,还有注册表中的IRQ地址 是十六进制的么?是系统中断还是物理中断?我看到有的注册表中给了SYS_INTERRUPT的地址。有的是IRQ
答:IRQ物理中断,sysintr系统中断,sysintr通过调用物理中断转系统中断得到的,当中断触发时系统先知道irq,再根据你irq所绑定的sysintr获取sysintr,而中断事件就是和sysintr绑定的。如果注册表中有sysintr,则在在驱动之前必须人为的调用OALIntrStaticTranslate函数进行irq和sysintr的绑定。


4,还有这个IOBase 我按照手册上的地址总是不对 4.2的,这个怎么得来的?按照总线地址计算么?似乎感觉不对啊!

答: IOBase 根据你16550所接的ap的片选得到的
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

14
 
顶!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 
借宝地一用
想问gooogleman个问题,你在ce5.0下的2440板子上,移植16550的驱动就是直接用微软的那个dll,然后通过修改注册表中的内容就实现了吗?
我也在做这个东西,把微软的代码拷贝一份出来后,加入bsp中后,编译有错,是WINCETARGETFILE0的问题,注释了这个后就不能生成dll了,正郁闷在这里,不知道我的路走的对不对。
呵呵,给个提示吧
 
 
 

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

随便看看
查找数据手册?

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