天嵌 ARM开发社区

 找回密码
 注册
查看: 2421|回复: 4

问: SPI_Init()没有被加载。

[复制链接]
415934229 发表于 2012-10-31 14:55:20 | 显示全部楼层 |阅读模式
驱动的SPI_Init()没有被加载,注册表builtin和Active里均有spi,但是就是加载不上,SPI_Init()没有被调用。
.bib中的:
;------------------ High Speed SPI Driver -------------------------------------------------
IF BSP_NOSPI !
s3c6410_spi.dll  $(_FLATRELEASEDIR)\s3c6410_spi.dll                                                        $(XIPKERNEL)        SHMK
ENDIF BSP_NOSPI !
;---------------------------------------------------------------------------------------

.reg中的:
;------------ High Speed SPI Driver ------------------------------------------
IF BSP_NOSPI !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\spi]
        "Prefix"="SPI"
        "Dll"="s3c6410_spi.dll"
        "Index"=dword:1
        "Order"=dword:30
ENDIF BSP_NOSPI !
;-------------------------------------------------------------------------

source文件里的:

RELEASETYPE=PLATFORM

PREPROCESSDEFFILE=1

TARGETNAME=s3c6410_spi
TARGETTYPE=DYNLINK
DEFFILE=spi.def
DLLENTRY=DllMain
CDEFINES=$(CDEFINES) -DALLOW_USER_MODE_ACCESS

INCLUDES=$(INCLUDES);\
    $(_TARGETPLATROOT)\src\drivers\DMA\s3c6410_dma_lib;

TARGETLIBS=\
    $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib    \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib    \

SOURCELIBS=\
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\s3c6410_dma_lib.lib    \

SOURCES=\
    spi.c
embedsky_lhh 发表于 2012-10-31 15:00:45 | 显示全部楼层
在TQ6410.bat中将set BSP_NOSPI=1
改为set BSP_NOSPI=就会加载了
 楼主| 415934229 发表于 2012-10-31 15:04:31 | 显示全部楼层
embedsky_lhh 发表于 2012-10-31 15:00
在TQ6410.bat中将set BSP_NOSPI=1
改为set BSP_NOSPI=就会加载了

亲 set BSP_NOSPI= 设置好了,现在注册表里有spi,但是SPI_Init()还是没有调用,CreateFile(TEXT("SPI1:"),...)可以打开的,但就是不能初始化,急呀。
embedsky_lhh 发表于 2012-10-31 15:10:59 | 显示全部楼层
415934229 发表于 2012-10-31 15:04
亲 set BSP_NOSPI= 设置好了,现在注册表里有spi,但是SPI_Init()还是没有调用,CreateFile(TEXT("SPI1:" ...

你凭什么依据来判断他没调用,有没有加有效的打印信息?
 楼主| 415934229 发表于 2012-10-31 15:18:48
embedsky_lhh 发表于 2012-10-31 15:10
你凭什么依据来判断他没调用,有没有加有效的打印信息?

有啊,添加了很多RETAILMSG(1,.......)的,请看代码: 求解释
PSPI_PUBLIC_CONTEXT SPI_Init(PVOID Context)
{
    LPTSTR                          ActivePath = (LPTSTR) Context;
    PSPI_PUBLIC_CONTEXT             pPublicSpi = NULL;
    BOOL                            bResult = TRUE;
    DWORD                           dwHwIntr=0;

    RETAILMSG(SPI_INIT,(TEXT("++[SPI] HSP_Init Function\r\n")));
    RETAILMSG(1,(TEXT("[SPI] Active Path : %s\r\n"), ActivePath));

    if ( !(pPublicSpi = (PSPI_PUBLIC_CONTEXT)LocalAlloc( LPTR, sizeof(SPI_PUBLIC_CONTEXT) )) )
    {
        RETAILMSG(SPI_INIT,(TEXT("[SPI] Can't not allocate for SPI Context\r\n")));
        bResult = FALSE;
        goto CleanUp;
    }

    if ( !(pRestoreSPIregs = (PS3C6410_SPI_REG)LocalAlloc( LPTR, sizeof(S3C6410_SPI_REG) )) )
    {
        RETAILMSG(SPI_INIT,(TEXT("[SPI] Can't not allocate for pRestoreSPIregs \r\n")));
        bResult = FALSE;
        goto CleanUp;
    }
    if(!HW_Init(pPublicSpi))
    {
        RETAILMSG(SPI_INIT,(TEXT("[SPI] HW_Init is failed\r\n")));
        bResult = FALSE;
        goto CleanUp;
    }
    if(!InitializeBuffer())
    {
        RETAILMSG(SPI_INIT,(TEXT("[SPI] InitializeBuffer is failed\r\n")));
        bResult = FALSE;
        goto CleanUp;
    }
    // Request DMA Channel
    // DMA context have Virtual IRQ Number of Allocated DMA Channel
    // You Should initialize DMA Interrupt Thread after "Request DMA Channel"
    if( DMA_request_channel(&g_OutputDMA, DMA_SPI0_TX) != TRUE )
    {
        RETAILMSG(SPI_INIT,(TEXT("[SPI] DMA SPI TX channel request is failed\r\n")));
        bResult = FALSE;
        goto CleanUp;   
    }
    if( DMA_request_channel(&g_InputDMA, DMA_SPI0_RX) != TRUE )
    {
       RETAILMSG(SPI_INIT,(TEXT("[SPI] DMA SPI RX channel request is failed\r\n")));
        bResult = FALSE;
        goto CleanUp;   
    }
RETAILMSG(SPI_INIT,(TEXT("[SPI] DMA SPI RX and TX channel request is success \r\n")));
    do
    {
        InitializeCriticalSection(&(pPublicSpi->CsRxAccess));
        InitializeCriticalSection(&(pPublicSpi->CsTxAccess));

        //Rx Thread
        pPublicSpi->hRxEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pPublicSpi->hRxEvent == NULL)
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Rx Event creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Rx EVENT creation success!!!\r\n")));
        pPublicSpi->hRxThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadForRx, (LPVOID)pPublicSpi, 0, (LPDWORD)&pPublicSpi->dwRxThreadId);
        if (pPublicSpi->hRxThread == NULL)
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Rx Thread creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                 RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Rx THREAD creation success!!!\r\n")));
        pPublicSpi->hRxDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pPublicSpi->hRxDoneEvent == NULL)
        {
            RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Rx Done Event creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Rx Done Event creation success !!!\r\n")));
        pPublicSpi->hRxIntrDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pPublicSpi->hRxIntrDoneEvent == NULL)
        {
            RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Rx Interrupt Event creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Rx Interrupt Event creation success !!!\r\n")));
        //Tx Thread
        pPublicSpi->hTxEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pPublicSpi->hTxEvent == NULL)
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Tx Event creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                 RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Tx EVENT creation success !!!\r\n")));
        pPublicSpi->hTxThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadForTx, (LPVOID)pPublicSpi, 0, (LPDWORD)&pPublicSpi->dwTxThreadId);
        if (pPublicSpi->hTxThread == NULL)
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Tx Thread creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Tx Thread creation success !!!\r\n")));
        pPublicSpi->hTxDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pPublicSpi->hTxDoneEvent == NULL)
        {
            RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Tx Done Event creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }        
                                                RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Tx Done Event creation success !!!\r\n")));
        pPublicSpi->hTxIntrDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (pPublicSpi->hTxIntrDoneEvent == NULL)
        {
            RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Tx Interrupt Event creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT, (TEXT("[SPI] SPI Tx Interrupt Event creation success !!!\r\n")));
        //Spi ISR
        pPublicSpi->dwSpiSysIntr = SYSINTR_NOP;
        dwHwIntr = IRQ_SPI0;        //HS-SPI

        pPublicSpi->hSpiEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

        if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwHwIntr, sizeof(DWORD), &pPublicSpi->dwSpiSysIntr, sizeof(DWORD), NULL))
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] Failed to request the SPI sysintr.\r\n")));
            pPublicSpi->dwSpiSysIntr = SYSINTR_UNDEFINED;
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] successed to request the SPI sysintr.\r\n")));
        if (!InterruptInitialize(pPublicSpi->dwSpiSysIntr, pPublicSpi->hSpiEvent, NULL, 0))
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Interrupt Initialization failed!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Interrupt Initialization successed !!!\r\n")));
        pPublicSpi->hSpiThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadForSpi, (LPVOID)pPublicSpi, 0, (LPDWORD)&pPublicSpi->dwSpiThreadId);
        if (pPublicSpi->hSpiThread == NULL)
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI ISR Thread creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI ISR Thread creation successed !!!\r\n")));
        //Tx DMA Done ISR
        pPublicSpi->dwTxDmaDoneSysIntr = SYSINTR_NOP;
        dwHwIntr = g_OutputDMA.dwIRQ;

        pPublicSpi->hTxDmaDoneDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        pPublicSpi->hTxDmaDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] Tx DMA Done ISR(hTxDmaDoneDoneEvent and hTxDmaDoneEvent) creation successed !!!\r\n")));
        if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwHwIntr, sizeof(DWORD), &pPublicSpi->dwTxDmaDoneSysIntr, sizeof(DWORD), NULL))
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] Failed to request the SPI_DMA sysintr.\r\n")));
            pPublicSpi->dwTxDmaDoneSysIntr = SYSINTR_UNDEFINED;
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] successed to request the SPI_DMA sysintr.\r\n")));
        if (!InterruptInitialize(pPublicSpi->dwTxDmaDoneSysIntr, pPublicSpi->hTxDmaDoneEvent, NULL, 0))
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] DMA Interrupt Initialization failed!!!\r\n")));
            bResult = FALSE;
            break;
        }
                                                RETAILMSG(SPI_INIT,(TEXT("[SPI] DMA Interrupt Initialization successed !!!\r\n")));
        pPublicSpi->hTxDmaDoneThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ThreadForTxDmaDone, (LPVOID)pPublicSpi, 0, (LPDWORD)&pPublicSpi->dwTxDmaDoneThreadId);
        if (pPublicSpi->hTxDmaDoneThread == NULL)
        {
            RETAILMSG(SPI_INIT,(TEXT("[SPI] SPI Dma Thread creation error!!!\r\n")));
            bResult = FALSE;
            break;
        }
支持 反对

embedsky_lhh 发表于 2012-10-31 15:31:10 | 显示全部楼层
415934229 发表于 2012-10-31 15:18
有啊,添加了很多RETAILMSG(1,.......)的,请看代码: 求解释
PSPI_PUBLIC_CONTEXT SPI_Init(PVOID Cont ...

你调试串口开启了没有,其他驱动的调试信息看到了吗?是不是编译成3串口的那种了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 00:24 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表