YL2410添加串口

想到一个YL2410添加串口的方法,各位用过的朋友来给提提建议!

板子是yl2410的,优龙给的 BSP是4.2移植到5.0的,所以网上一些4.2和5.0的方法都不管用,找论坛的帖子按上面的方法做都是不行,经过一段时间研究,想到一个办法,现在贴出来,请各位朋友高手看看有什么问题,或者给刚开始用yl2410的朋友一点 提示,少走弯路。
第一步,我把SMDK2410/DIRVERS下的serial这个 驱动 程序复制了一份,命名为:
serial1.(优龙的BSP里没有关于串口2、3的驱动,所以自给自足)

第二步,在DRIVERS下的dirs文件里添加:
# @CESYSGEN IF COREDLL_SERDEV
            serial1                /   
# @CESYSGEN ENDIF COREDLL_SERDEV

DIRS=                 /
                .......                /
                serial1                /
                .......                /

第三步,在serial里面,把ser2410_hw.c、ser2410_ser.c、ser2410.def全部改名为:
ser24101_hw.c、ser24101_ser.c、ser24101.def,并在ser24101_hw.c文件中的
SER_VirtualAlloc函数中的
v_p UART0regs = (volatile UART0reg *)SER_RegAlloc((PVOID) UART1_BASE, sizeof( UART0reg));
                if (v_pUART0regs == NULL)
                {
                    ERRORMSG(1,(TEXT("For UART0reg: VirtualAlloc failed!/r/n")));
                    break;
                }改为:
v_pUART0regs = (volatile UART0reg *)SER_RegAlloc((PVOID)UART1_BASE, sizeof(UART1reg));
                if (v_pUART0regs == NULL)
                {
                    ERRORMSG(1,(TEXT("For UART0reg: VirtualAlloc failed!/r/n")));
                    break;
                }
(UART1_BASE=0xB1004000也就是0x50004000)

第四步,将serial文件夹下的source文件改为:
SOURCES= /
        ser24101_ser.c /
        ser24101_hw.c /
        mdd.c
(目的为了生成ser24101.dll)

第五步,更改platform.bib和platform.reg文件
platform.bib: 添加
IF BSP_NOSERIAL !
    ser24101.dll          $(_FLATRELEASEDIR)/ser2410.dll        NK        SH
ENDIF BSP_NOSERIAL !
platform.reg: 添加
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SER24101]
   "DeviceArrayIndex"=dword:0
   "Irq"=dword:19
  "IoBase"=dword:50004000
   "IoLen"=dword:2C
   "Prefix"="COM"
   "Dll"="SER24101.Dll"
   "Order"=dword:0
   "Priority"=dword:0
   "Port"="COM2:"
   "DeviceType"=dword:0
   "FriendlyName"="Serial Cable on COM2:"
   "Tsp"="Unimodem.dll"
   "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

第六步,在Kernel文件夹中,更改cfw.c和armint.c文件
cfw.c文件中添加:
OEMInterruptEnable()
case SYSINTR_SERIAL1:        // Serial port.
                s2410INT->rSUBSRCPND  = (INTSUB_RXD1 | INTSUB_TXD1 | INTSUB_ERR1);
                s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;
                s2410INT->rINTSUBMSK &= ~INTSUB_TXD1;
                s2410INT->rINTSUBMSK &= ~INTSUB_ERR1;
                s2410INT->rSRCPND     = BIT_UART1;
                // S3C2410X Developer Notice (page 4) warns against writing a 1 to a 0 bit in the INTPND register.
                if (s2410INT->rINTPND & BIT_UART1) s2410INT->rINTPND = BIT_UART1;
                s2410INT->rINTMSK    &= ~BIT_UART1;
                break;
OEMInterruptDisable()
case SYSINTR_SERIAL1:
                s2410INT->rINTMSK    |= BIT_UART1;
                s2410INT->rINTSUBMSK |= INTSUB_RXD1;
                s2410INT->rINTSUBMSK |= INTSUB_TXD1;
                s2410INT->rINTSUBMSK |= INTSUB_ERR1;
                break;
OEMInterruptDone()
case SYSINTR_SERIAL1:
                s2410INT->rINTMSK    &= ~BIT_UART1;
                s2410INT->rINTSUBMSK &= ~INTSUB_RXD1;
                break;       
armint.c中添加:
OEMInterruptHandler()
else if(IntPendVal == INTSRC_UART1)        // SERIAL (UART1) (physical COM2: P1 connector).
        {  
                SubIntPendVal = s2410INT->rSUBSRCPND;

                // Note that we only mask the sub source interrupt - the serial driver will clear the
                // sub source pending register.
                //
                if(SubIntPendVal & INTSUB_ERR1)
                {
                        s2410INT->rINTSUBMSK |= INTSUB_ERR1;
                }
                else if(SubIntPendVal & INTSUB_RXD1)
                {
                        s2410INT->rINTSUBMSK |= INTSUB_RXD1;
                }
                else if(SubIntPendVal & INTSUB_TXD1)
                {
                        s2410INT->rINTSUBMSK |= INTSUB_TXD1;
                }
                else
                {
                        return(SYSINTR_NOP);
                }
       
                // NOTE: Don't clear INTSRC:UART0 here - serial driver does that.
                //
                s2410INT->rINTMSK |= BIT_UART1;
                if (s2410INT->rINTPND & BIT_UART1) s2410INT->rINTPND  = BIT_UART1;

                return(SYSINTR_SERIAL1);
        }

第七步,在INC文件夹中,更改,添加:
oalintr.h:
#define        SYSINTR_SERIAL1                (SYSINTR_FIRMWARE+19)
oalintr.inc:
SYSINTR_SERIAL1:        .equ                SYSINTR_FIRMWARE+19
oalintra.inc:
SYSINTR_SERIAL1        EQU        SYSINTR_FIRMWARE+19
这样改过以后,原先运行我的串口测试软件时出现的只能用串1或串口2的情况解决了,同时打开两个串口,并没有像以前一样提示其中一个串口被占用,但是现在只有串口1能够发数据,不能接收,而串口2收发都没有什么反应,而且运行程序系统还会死掉,不知道问题在哪里,看哪位高手朋友能帮我找找问题在什么地方,或者哪位朋友有思路可以试一试!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值