原创 在wince4.2下加载16C550串口驱动(转)

2009-7-18 08:32 1420 3 3 分类: MCU/ 嵌入式

出自: http://www.cnemb.com/forum/read.php?tid=23015
在wince4.2下加载16C550串口驱动 7SA-OFM  
  系统是S3C2440,串口4是16C550外扩的,用于同GPRS通信。 G&%nF4  
一.注册中断 \'It,PN  
1、 在platform\\smdk2410\\inc\\Oalintr.h文件中添加 i)@U.-*5m  
    #define SYSINTR_SERIAL4           (SYSINTR_FIRMWARE+22)
(^tr}?C
 
    同时注意修改MapIrq2SysIntr(DWORD _Irq)函数中_Irq判断条件,在我的系统中 eN<>#:`  
    if( _Irq<=23 ) nl)_`8=  
>}dTO/?  
//下面两处修改没有必要 =2.tu*!C  
2、 在 platform\\smdk2410\\inc\\Oalintr.inc添加 `uIx/.L  
  SYSINTR_SERIAL4:     .equ     SYSINTR_FIRMWARE+22 |dl0B26x  
?o(ZTlT  
3、 在 platform\\smdk2410\\inc\\Oalintra.inc添加 *<`7|BH?3  
  SYSINTR_SERIAL4 EQU     SYSINTR_FIRMWARE+22 N5q}::Odc  
o9KyAP$2  
二.修改注册表 x !#Ma  
物理地址:10000000,使用nGCS2 cPA~eZbX  
中断号0x16 = 22,物理中断Eint3 nwa\Lrh  
;UART3 (physical COM4) (Serial) );Tx5Z}  
IF BSP_NOSERIAL ! :[y]p7;{f  
;=============== 16c552 COM4 (Serial) =============== $Nj'OJSj%  
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SER24404] qg^(w fI  
  "DeviceArrayIndex"=dword:3 *hv=~A
$q
 
  "Irq"=dword:16 7MKD_`g  
  "IoBase"=dword:10000000 NzjMk4t  
  "IoLen"=dword:8 ?"()>PJx  
  "Prefix"="COM" ]O6KKz  
  "Dll"="SER2440.Dll" aXRv}WO$>k  
  "Order"=dword:0 Gh2#-~|cB  
  "Index"=dword:4 VT'0DQ!NIq  
  "Priority"=dword:0 $8jaapNm@  
  "Port"="COM4:" 0('OyH)  
  "RegStride"=dword:1 Kp8fh-4_  
  "DeviceType"=dword:0 Po1hq2-U8  
  "FriendlyName"="Serial Cable on COM4:" zT$0xj8  
  "Tsp"="Unimodem.dll" _B}9f  
  "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 f(!E!\&n^  
ENDIF BSP_NOSERIAL ! y7>iz6N  
/CH(!\bQ  
三.修改cfw.c itw{;j  
1、OEMInterruptEnable()中: ;xhOj<:  
  case SYSINTR_SERIAL4:   //16c552 Eint3 "2%>M  
    s2440INT->rSRCPND = BIT_EINT3; // to clear the previous pending states z9 O~W5-U  
    if (s2440INT->rINTPND & BIT_EINT3) vmvFBzLR  
        s2440INT->rINTPND = BIT_EINT3; #XcU{5Qm5  
    s2440INT->rINTMSK &= ~BIT_EINT3; O"\nR:\  
    break;
fSjs?zd`
 
+ZclGchw  
2、OEMInterruptDisable()中 zFywC-my@  
  case SYSINTR_SERIAL4: 1+a@k  
    s2440INT->rINTMSK |= BIT_EINT3; p-,Iio+  
    break; S7CV
w,2
 
  x#mtS-sw2Q  
3、OEMInterruptDone()中 N
xFUO0O3
 
  case SYSINTR_SERIAL4: 3 z=\.R  
    s2440INT->rINTMSK &= ~BIT_EINT3; Oc~aW3*A(  
    break; =!CU ?$g  
^)0 9OV+hF  
四.修改文件armint.c :6D0j  
  else if (IntPendVal == INTSRC_EINT3)   // 16C552 int {cR=N~_EO  
  { EnJ!mr  
      s2440INT->rINTMSK |= BIT_EINT3; +s~.A_7)  
      s2440INT->rSRCPND = BIT_EINT3;     6t7fa<  
      if (s2440INT->rINTPND & BIT_EINT3) s2440INT->rINTPND = BIT_EINT3; /M@PO"  
    //RETAILMSG(0,(TEXT("16C550 int generate\r\n")));           ($>XIb9f  
      return(SYSINTR_SERIAL4); Q7GY3X*kA  
  } pbLGe'  
JJnYOau  
五.修改2440_ser.c Cj^{9'0  
添加如下函数,详细函数代码请看附件S2440_ser.c c!wtf,F  
//for 16C552 c-8!#~M(  
static SlaDt  
PVOID B42sb_  
Ser4Init( #/
?"+
 
    ULONG   Identifier, // @parm Device identifier. BX< dSK  
    PVOID   pMddHead,   // @parm First argument to mdd callbacks. L*]0"E  
  PHWOBJ pHWObj     // @parm Pointer to our own HW OBJ for this device ax|1b`XUr"  
) bx}fj#J]En  
static `xz&Scil  
BOOL + WDq=S  
Ser4Open( #T3h}=  
    PVOID   pHead /*@parm PVOID returned by Serinit. */ %y<]Yzv.  
    ) f3tv3>p  
BOOL )S@jDaU<  
Ser4PowerOn( 5#2F1NX  
      PVOID   pHead     // @parm   PVOID returned by SerInit. xWX*tJ4  
      ) <7sIm^N  
static (pR.Abq  
BOOL BavO\{J#|0  
Ser4EnableIR( 6Y384  
      PVOID   pHead, // @parm PVOID returned by Serinit. *cv}*D  
      ULONG   BaudRate // @parm PVOID returned by HWinit. ;/8?{N0  
      ) v3RcwySk  
static `
%?9=h%
 
BOOL /Z%>ArAx  
Ser4DisableIR( ;y.E!  
        PVOID   pHead /*@parm PVOID returned by Serinit. */ I$q>  
        ) m7|RD]q&  
static ;[0&G6g  
BOOL i%{X9!*%TX  
Ser4PowerOff( Y:QD  
      PVOID   pHead     // @parm   PVOID returned by SerInit. 7^e +  
      ) MXh
"Y*}
 
static Sfjje4R  
BOOL
j2n,f7hl.
 
Ser4Deinit( Z@rN_WXx  
      PVOID   pHead   // @parm PVOID returned by SerInit. 7,$z;Lr0S  
      ) yubSj*  
static Yx?d X#3  
ULONG IO$z%r7  
Ser4Close( QL7>;t;  
    PVOID   pHead   // @parm PVOID returned by SerInit. =([av7  
    ) gQWd&)'muf  
static HRa@  
VOID [Gr*,nVvB  
Ser4GetCommProperties( BNGe
exs@
 
            PVOID   pHead,     // @parm PVOID returned by SerInit. TW&DFKK`  
            LPCOMMPROP pCommProp   // @parm Pointer to receive COMMPROP structure. 'C+;r?1!h  
            ) !UBO_X%dz  
BOOL TJ@Cj?y%  
Ser4_GetRegistryData(PSER_16552_INFO pHWHead, LPCTSTR regKeyPath) w2gf&Lc\  
3HV%4nZLf  
L?wJ0  
增加: R""%F#4XJ2  
const CX/(o]  
HW_VTBL Io16552VTbl4 = { H:&?ha,9  
  Ser4Init, P!g-X%ngo  
  SL_PostInitq, my\&hCE  
  Ser4Deinit, RNJFSD.  
  Ser4Open, 5a`%)K  
  Ser4Close, ".2K9j7$  
  SL_GetInterruptTypeq, &V=7D#?L  
  SL_RxIntrq, G$WOzY(  
  SL_TxIntrExq, Csst[3V  
  SL_OtherIntrq, 1JS2SxF  
  SL_LineIntrq,   /I{R23o  
  SL_GetRxBufferSizeq, v"6 ?\=@  
  Ser4PowerOff, S'i;xL>  
  Ser4PowerOn, zQ)+/e(8  
  SL_ClearDTRq, Iin#Wd-/  
  SL_SetDTRq, QJX/7RA  
  SL_ClearRTSq, HCnf2td  
  SL_SetRTSq, e-6w8*!i  
  Ser4EnableIR, C8b''9t.  
  Ser4DisableIR, )iE"Tl  
  SL_ClearBreakq, \_ow9vU  
  SL_SetBreakq, " ~Q*XN2  
  SL_XmitComCharq, #uvJH8)D  
  SL_GetStatusq, 4O$2]D.\  
  SL_Resetq, 3)E(RyQA3  
  SL_GetModemStatusq, JeQ[qQ  
  Ser4GetCommProperties, ~<O,Vs_C/  
  SL_PurgeCommq, l)Mh2lA,=  
  SL_SetDCBq, SGf9U^ds  
  SL_SetCommTimeoutsq Jt=>-Spj  
  }; i?>Hr|  
再增加: e-?6(F4  
const HWOBJ Io16552Obj4 = { [j0w\{  
  THREAD_AT_INIT, U$J5r+>  
  SYSINTR_SERIAL4, SaNN;X0  
  (PHW_VTBL) &Io16552VTbl4 DTy/jaK  
}; Wo3'd|Y~i  
!R{em4?8D  
修改GetSerialObject uBRw>"c_*8  
PHWOBJ ZR
mPP
 
GetSerialObject( $jcz?vH  
          DWORD DeviceArrayIndex gMay  
          ) iiN?\OO^~  
{ T#N80BH[  
  PHWOBJ pSerObj; !PI0oh  
B3.X}ys#  
  RETAILMSG(1,(TEXT("GetSerialObject%d\r\n"),DeviceArrayIndex)); Di])<V?  
1O4D+0@  
  IRDA = DeviceArrayIndex; ++gPv}:$X  
I*9Gb$]=  
  // Now return this structure to the MDD. 2X^iV09  
  if ( DeviceArrayIndex == 0 ) W
n6,U=$3
 
    pSerObj = (PHWOBJ)(&IoObj); sB8p(
L
 
  else if(DeviceArrayIndex == 1) Ho>p ^p  
    pSerObj = (PHWOBJ)(&IoObj2); 6\XP|n-0+0  
  else if(DeviceArrayIndex == 2) Px$'(eMj^3  
    pSerObj = (PHWOBJ)(&IoObj3); 5#P: "U  
  else if(DeviceArrayIndex == 3) [;Vi~$p|Eo  
    pSerObj = (PHWOBJ)(&Io16552Obj4); KqFmFcf|  
  else Qz'O{f  
    pSerObj = (PHWOBJ)(&IoObj); l
DgzM3
 
  return (pSerObj); >Zi|$@7t-  
} kVy"+ZebK  
oC5gME"2  
六.SOURCE文件 }o~Tw?z-|  
修改2440串口驱动的SOURCE文件,添加ser16552.c,见附录。 :/ ~):tM  
SOURCES= \ AviT+^7E?  
  ser2440_ser.c \ VG? yL2y  
  ser2440_hw.c \ ,oy4V?^B&  
  ser16552.c LPtx|Sx![  
{6REfY
c
 
看源代码可以搞清楚整个流程,MDD也需要看一下,但不需要修改。 GA({r?i  
在OEMInitInterrupts对Eint3中断进行设置,    上升沿触发 $u/8Rp  
//gerryzhou add ____ Configure EINT3(GPF3) for 16c552 com4 interrupt. "a?2H8x  
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3<<6)) | (0x2<<6);                //GPF3==EINT3 9 ayH:;  
s2440IOP->rGPFUP = (s2440IOP->rGPFUP    | (0x1<<3));                              // Disable pull-up. lk5_s@V
l
 
      YB(#]H|8S  

s2440IOP->rEXTINT0=(s2440IOP->rEXTINT0 & ~(0xf<<12)) |
(0x4<<12);            // Rising edge triggered triggered.
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /1 下一条