这是我在论坛的同主题帖子http://topic.csdn.net/u/20081028/11/97873b20-9b0c-4a84-8110-2af87aca6037.html
现在由于SD卡问题导致必须改为标准5.0BSP。以前一直以为差不多,现在发现差距不是一般大,首先从中断入手。
先看看我明白的4.2BSP开始吧
以串口为例子,看注册表
IF BSP_NOSERIAL !
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/UART0]
"DeviceArrayIndex"=dword:0
"Irq"=dword:03-----------这个和oalintr.h里面的#define SYSINTR_SERIAL (SYSINTR_FIRMWARE+3)对应
"IoBase"=dword:50000000
"IoLen"=dword:2C
"Prefix"="COM"
"Dll"="SER2440.Dll"
"Order"=dword:0
"Index"=dword:1
"Priority"=dword:0
"Port"="COM1:"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM1:"
"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
再看oalintr.h
- // These are the 'standard' interrupts
- #define SYSINTR_KEYBOARD (SYSINTR_FIRMWARE+0)
- #define SYSINTR_TOUCH (SYSINTR_FIRMWARE+1)
- #define SYSINTR_ADC (SYSINTR_FIRMWARE+2)
- #define SYSINTR_SERIAL(SYSINTR_FIRMWARE+3)//跟注册表里面的"Irq"=dword:03对应
- //.....................
- // I get the follow MapIrq2SysIntr inline function from CEPC include directory. hjcho.
- // CEPC device drivers should get their IRQ number from the registry and use
- // MapIrq2SysIntr to get the appropriate SYSINTR_* number to use.
- // 不知道这个MapIrq2SysIntr函数是是干什么的
- _inline
- DWORD
- MapIrq2SysIntr(DWORD _Irq)
- {
- // if( _Irq<=18 )
- if( _Irq<=32 ) //2008.5.9 amend
- return ( SYSINTR_FIRMWARE + _Irq );
- else
- return (0xffffffff);
- }
- // Here are the names of the values stored in the registry
- // 配合注册表,这点技术和标准5.0BS倒是没有多大变化
- #define PC_REG_IRQ_VAL_NAME TEXT("IRQ")
- #define PC_REG_IRQ_VAL_LEN sizeof( DWORD )
- #define PC_REG_IOBASE_VAL_NAME TEXT("IoBase")
- #define PC_REG_IOBASE_VAL_LEN sizeof( DWORD )
- #define PC_REG_IOLEN_VAL_NAME TEXT("IoLen")
- #define PC_REG_IOLEN_VAL_LEN sizeof( DWORD )
再来看标准5.0BSP,就以SD卡为例子
注册表
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SDHC_SMDK2440]
"Order"=dword:21
"Dll"="sdhc_sc2440.dll"
"Prefix"="SDH"
"DMAChannel"=dword:0 ; DMA channel to use. Set to 0xffffffff to disable DMA
"DMAIrq"=dword:11
"DMA_IST_Priority"=dword:96
"SDIOIrq"=dword:15---这个是怎么和s3c2440a_intr.h里面的#define IRQ_EINT16 44 绑定的?--看错了,应该是21,唉!
"SDIO_IST_Priority"=dword:97
"PollingTimeout"=dword:100 ; 100 ms
"CardDetect_Thread_Priority"=dword:98
"CardDetectGPIO"="G" ; card detect on GPG8
"CardDetectMask"=dword:100
"CardDetectFlag"=dword:0
"CardDetectControlMask"=dword:fffcffff
"CardDetectControlFlag"=dword:0
"CardDetectPullupMask"=dword:fffffeff
"CardDetectPullupFlag"=dword:100
"CardReadWriteGPIO"="H" ; card R/W on GPH8
"CardReadWriteMask"=dword:100
"CardReadWriteFlag"=dword:100
"CardReadWriteControlMask"=dword:fffcffff
"CardReadWriteControlFlag"=dword:0
"CardReadWritePullupMask"=dword:fffffeff
"CardReadWritePullupFlag"=dword:100
"HandleBusyFinishOnCommand38"=dword:1
"DmaTransferTimeoutFactor"=dword:8
"DmaTransferTimeoutConstant"=dword:3000
ENDIF BSP_SDHC_SC2440
; @CESYSGEN ENDIF CE_MODULES_SDBUS
//======= Header: s3c2440a_intr.h里面是物理中断号宏定义。
---------呜呜,我太粗心大意了,呜呜,不好意思。太丢人了,结贴,给分。谢谢hzdysymbol
It's done!