4504|4

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE下利用DeviceIoControl向SD卡发送apdu命令 [复制链接]

本人正在开发一快SD接口的开发板,想在CE下向sd接口的设备发送指令进行控制,CTL_CODE(FILE_DEVICE_DISK, 0x700, METHOD_BUFFERED, FILE_ANY_ACCESS)这样设置CTL_CODE是否正确,尤其是那个0x700到底什么意思,msdn上也没有具体说明。本人qq215442015,已经实现了CE下和usb接口设备的通讯,如果需要代码的可以联系我,请高人指点,谢谢

最新回复

/******************************************************************************************* 函数名称: SML_Open 描    述: 打开驱动程序 输入参数: DWORD dwData     : 设备驱动程序句柄           DWORD dwAccess   : 访问请求代码,是读和写的组合           DWORD dwShareMode: 共享模式   输出参数: 返    回: 驱动程序引用事例句柄 *******************************************************************************************/ DWORD SML_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode) {         return 1; } /******************************************************************************************* 函数名称: SML_Close 描    述: 驱动程序关闭函数 输入参数: DWORD Handle:驱动程序句柄 输出参数: 无 返    回: FALSE: 失败    TRUE: 成功 *******************************************************************************************/ BOOL SML_Close(DWORD Handle) {         return (TRUE); } /******************************************************************************************* 函数名称: SML_Read 描    述: 输入参数: DWORD Handle    : 驱动程序引用事例句柄           LPVOID pBuffer  : 接收缓冲区           DWORD dwNumBytes: 要读的字节数 输出参数: 无 返    回: 实际读到字节数 *******************************************************************************************/ DWORD SML_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes) {         return (0); } /******************************************************************************************* 函数名称: SML_Write 描    述: 输入参数: 输出参数: 返    回: 成功发送的字节数 *******************************************************************************************/ DWORD SML_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes) {         return (0); } /******************************************************************************************* 函数名称: SML_Seek 描    述: 对设备的数据指针进行操作,本驱动不支持该函数 输入参数: 输出参数: 返    回: *******************************************************************************************/ DWORD SML_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod) {         return (DWORD)-1; } /******************************************************************************************* 函数名称: SML_PowerUp 描    述: 电源下电驱动处理函数 输入参数: 输出参数: 返    回: 无 *******************************************************************************************/ VOID SML_PowerUp(VOID) {         return; } /******************************************************************************************* 函数名称: SML_PowerDown 描    述: 电源下电驱动处理函数 输入参数: 输出参数: 返    回: 无 *******************************************************************************************/ BOOL SML_PowerDown(VOID) {         RETAILMSG (1, (TEXT("SMLoader Power down end...\r\n")));         return (TRUE); } /******************************************************************************************* 函数名称: SML_Deinit 描    述: 驱动程序卸载函数 输入参数: DWORD dwContext: 驱动程序句柄 输出参数: 无 返    回: FALSE: 失败    TRUE: 成功 *******************************************************************************************/ BOOL  SML_Deinit(DWORD dwData) {         return (TRUE); } /******************************************************************************************* 函数名称: SML_IOControl 描    述: 驱动程序 I/O 请求 输入参数: 输出参数: 返    回: TRUE: 成功   FALSE: 失败 *******************************************************************************************/ BOOL SML_IOControl(     DWORD Handle,     DWORD dwIoControlCode,     PBYTE pInBuf,     DWORD nInBufSize,     PBYTE pOutBuf,     DWORD nOutBufSize,     PDWORD pBytesReturned     ) {         return (FALSE); }   详情 回复 发表于 2007-11-28 13:00
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我是希望向flash驱动发命令,可是总是返回参数错误,这个问题不好解决呀。
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

#include

// 全局变量
HANDLE  hSDEvent;
void InitializeHardware(void);

HANDLE  gSDMMCDetectThread;                                                        /* 检测线程句柄 */
HANDLE  gSDMMCIntrEvent;                                                        /* 中断事件 */

HANDLE hDevice = NULL;
static BOOL SDMMC_DETECT = 0;                                                /* 卡原来是否已经插入,*/

UINT32 g_CardInsertIrq = IRQ_EINT18;                                /* 使用EINT18作为卡插入与否检测线 */
UINT32 g_CardInsertSysIntr = SYSINTR_UNDEFINED;

static volatile S3C2410X_IOPORT_REG * v_pIOPregs;

/*******************************************************************************************
函数名称: SDMMCLoader_InitializeAddresses
描    述: 获取 GPIO 寄存器的虚拟空间
输入参数: 无
输出参数: 无
返    回: 驱动程序引用事例句柄
*******************************************************************************************/
static BOOL SDMMCLoader_InitializeAddresses(VOID)
{
        BOOL        RetValue = TRUE;

        RETAILMSG(1, (TEXT("::: SDMMCLoader Initialize address..set..\r\n")));
       
        /* IO Register Allocation */
        v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
        if (v_pIOPregs == NULL)
        {
                ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
                RetValue = FALSE;
        }
        else
        {
                if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2410X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
                {
                        ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
                        RetValue = FALSE;
                }
        }
       
        if (!RetValue)
        {
                RETAILMSG (1, (TEXT("::: PBT_InitializeAddresses - Fail!!\r\n") ));

                if (v_pIOPregs)
                {
                        VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
                }

                v_pIOPregs = NULL;
        }
        else
                RETAILMSG (1, (TEXT("::: SDMMCLoader_InitializeAddresses - Success\r\n") ));

        return(RetValue);
}


/*******************************************************************************************
函数名称: InitializeHardware
描    述: 初始化硬件: 设置 GP10 为 EINT18, 并且中断为双边沿触发
输入参数: 无
输出参数: 无
返    回: 无
*******************************************************************************************/
void InitializeHardware(void)
{
        v_pIOPregs->GPGCON &= ~(0x03 << 20);                          
        v_pIOPregs->GPGCON |= (0x02 << 20);                        /* GPG10 is Interrupt Pin (EINT18) */
        v_pIOPregs->GPGUP  &= ~(1<<10);                                /* enable pull up */

    v_pIOPregs->EXTINT2 &= ~(0x7 << 8);                        /* Configure EINT18 as Falling Edge Mode */
    v_pIOPregs->EXTINT2 |=  (0x6 << 8);
}


/*******************************************************************************************
函数名称: SDMMCDetectThread
描    述: 卡是否插入检测线程
输入参数: LPVOID pArgument:   线程输入参数
输出参数: 无
返    回: 1: 没有特别含义
*******************************************************************************************/
WCHAR *szRegKey_SDMMC = L"Drivers\\SDCARD\\ClientDrivers\\Class\\SDMemory_Class";

static DWORD WINAPI  SDMMCDetectThread(LPVOID pArgument)
{       
        RETAILMSG(1, (TEXT("Entering SDMMCDetectThread done.\r\n")));       

        Sleep (1000);                                                                                                // Same as CF driver, wait for 1 sencond to avoid data abort.
               
        while(1)
        {
                 Sleep(20);
       
                if (((v_pIOPregs->GPGDAT & (0x01 << 10)) != 0) && (SDMMC_DETECT == 1))
                {
                        RETAILMSG(1, (TEXT("INFO: SD/MMC Card is removed.\r\n")));
                        SDMMC_DETECT = 0;
                       
                        DeactivateDevice(hDevice);                                                        /* 卸载SD/MMC卡驱动 */
                        InterruptDone(g_CardInsertSysIntr);                                        /* 中断结束 */
                }                
            
                if ((SDMMC_DETECT == 0) && ((v_pIOPregs->GPGDAT & (0x01 << 10)) == 0))
                {               
                        RETAILMSG(1, (TEXT("INFO: SD/MMC Card is detected.\r\n")));
                       
                        SDMMC_DETECT = 1;
                        hDevice = ActivateDeviceEx(szRegKey_SDMMC, NULL, 0, NULL);        /* 加载SD/MMC卡驱动 */
                        InterruptDone(g_CardInsertSysIntr);
                }
                else
                {
                        InterruptDone(g_CardInsertSysIntr);
                }       
               
                WaitForSingleObject(hSDEvent, INFINITE);                                /* 等待卡的下一次插入/拨出事件 */
        }

        return 1;
}



/*******************************************************************************************
函数名称: DllEntry
描    述: 驱动程序动态库入口
输入参数:        
输出参数:
返    回:
*******************************************************************************************/
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch ( dwReason )
        {
                case DLL_PROCESS_ATTACH:
                        RETAILMSG(1, (TEXT("SDMMCLoader: DLL_PROCESS_ATTACH\r\n")));
                        DisableThreadLibraryCalls((HMODULE) hInstDll);
                        break;

                case DLL_PROCESS_DETACH:
                        RETAILMSG(1, (TEXT("SDMMCLoader: DLL_PROCESS_DETACH\r\n")));
                        break;
    }
   
    return (TRUE);
}


/*******************************************************************************************
函数名称: IIC_Init
描    述: 驱动程序初始化函数
输入参数: DWORD dwContext: 设备管理器传递给本驱动的参数, 通常为流接口驱动在注册表内的位置        
输出参数: 无
返    回: 驱动程序句柄
*******************************************************************************************/
DWORD SML_Init(DWORD dwContext)
{
        // 申请硬件寄存器虚拟空间
        SDMMCLoader_InitializeAddresses();

        // 初始化硬件
        InitializeHardware();       

        // 创建卡插入事件
        hSDEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if(!hSDEvent)
        {
                RETAILMSG( 1, (TEXT("SML_Init: CreateEvent hSDEvent failed, error = %x\r\n"), GetLastError()));
                return FALSE;
        }

    // 向 OAL 层申请硬件中断对应的逻辑中断
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CardInsertIrq, sizeof(UINT32), &g_CardInsertSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: SDMMCLoader: Failed to request sysintr value for SDMMC Card Detect interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: SDMMCLoader: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_CardInsertIrq, g_CardInsertSysIntr));

        // 绑定卡插入逻辑中断到对应的事件
        InterruptDone(g_CardInsertSysIntr);
        InterruptDisable(g_CardInsertSysIntr);
        if (!(InterruptInitialize(g_CardInsertSysIntr, hSDEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: SDMMCLoader: Interrupt initialize failed.\r\n")));
                return FALSE;
        }

        // 创建卡插入检测线程
        gSDMMCDetectThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SDMMCDetectThread, NULL, 0, NULL);
        if (gSDMMCDetectThread == NULL )
        {
        RETAILMSG(1, (TEXT("Fatal Error!  Failed to create MMC card detect thread.\r\n")));
        return (FALSE);
        }
               
        RETAILMSG(1, (TEXT(":::SML_Init Sucessfully.\r\n")));
        return TRUE;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 

#include

// 全局变量
HANDLE  hSDEvent;
void InitializeHardware(void);

HANDLE  gSDMMCDetectThread;                                                        /* 检测线程句柄 */
HANDLE  gSDMMCIntrEvent;                                                        /* 中断事件 */

HANDLE hDevice = NULL;
static BOOL SDMMC_DETECT = 0;                                                /* 卡原来是否已经插入,*/

UINT32 g_CardInsertIrq = IRQ_EINT18;                                /* 使用EINT18作为卡插入与否检测线 */
UINT32 g_CardInsertSysIntr = SYSINTR_UNDEFINED;

static volatile S3C2410X_IOPORT_REG * v_pIOPregs;

/*******************************************************************************************
函数名称: SDMMCLoader_InitializeAddresses
描    述: 获取 GPIO 寄存器的虚拟空间
输入参数: 无
输出参数: 无
返    回: 驱动程序引用事例句柄
*******************************************************************************************/
static BOOL SDMMCLoader_InitializeAddresses(VOID)
{
        BOOL        RetValue = TRUE;

        RETAILMSG(1, (TEXT("::: SDMMCLoader Initialize address..set..\r\n")));
       
        /* IO Register Allocation */
        v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
        if (v_pIOPregs == NULL)
        {
                ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
                RetValue = FALSE;
        }
        else
        {
                if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2410X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
                {
                        ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
                        RetValue = FALSE;
                }
        }
       
        if (!RetValue)
        {
                RETAILMSG (1, (TEXT("::: PBT_InitializeAddresses - Fail!!\r\n") ));

                if (v_pIOPregs)
                {
                        VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
                }

                v_pIOPregs = NULL;
        }
        else
                RETAILMSG (1, (TEXT("::: SDMMCLoader_InitializeAddresses - Success\r\n") ));

        return(RetValue);
}


/*******************************************************************************************
函数名称: InitializeHardware
描    述: 初始化硬件: 设置 GP10 为 EINT18, 并且中断为双边沿触发
输入参数: 无
输出参数: 无
返    回: 无
*******************************************************************************************/
void InitializeHardware(void)
{
        v_pIOPregs->GPGCON &= ~(0x03 << 20);                          
        v_pIOPregs->GPGCON |= (0x02 << 20);                        /* GPG10 is Interrupt Pin (EINT18) */
        v_pIOPregs->GPGUP  &= ~(1<<10);                                /* enable pull up */

    v_pIOPregs->EXTINT2 &= ~(0x7 << 8);                        /* Configure EINT18 as Falling Edge Mode */
    v_pIOPregs->EXTINT2 |=  (0x6 << 8);
}


/*******************************************************************************************
函数名称: SDMMCDetectThread
描    述: 卡是否插入检测线程
输入参数: LPVOID pArgument:   线程输入参数
输出参数: 无
返    回: 1: 没有特别含义
*******************************************************************************************/
WCHAR *szRegKey_SDMMC = L"Drivers\\SDCARD\\ClientDrivers\\Class\\SDMemory_Class";

static DWORD WINAPI  SDMMCDetectThread(LPVOID pArgument)
{       
        RETAILMSG(1, (TEXT("Entering SDMMCDetectThread done.\r\n")));       

        Sleep (1000);                                                                                                // Same as CF driver, wait for 1 sencond to avoid data abort.
               
        while(1)
        {
                 Sleep(20);
       
                if (((v_pIOPregs->GPGDAT & (0x01 << 10)) != 0) && (SDMMC_DETECT == 1))
                {
                        RETAILMSG(1, (TEXT("INFO: SD/MMC Card is removed.\r\n")));
                        SDMMC_DETECT = 0;
                       
                        DeactivateDevice(hDevice);                                                        /* 卸载SD/MMC卡驱动 */
                        InterruptDone(g_CardInsertSysIntr);                                        /* 中断结束 */
                }                
            
                if ((SDMMC_DETECT == 0) && ((v_pIOPregs->GPGDAT & (0x01 << 10)) == 0))
                {               
                        RETAILMSG(1, (TEXT("INFO: SD/MMC Card is detected.\r\n")));
                       
                        SDMMC_DETECT = 1;
                        hDevice = ActivateDeviceEx(szRegKey_SDMMC, NULL, 0, NULL);        /* 加载SD/MMC卡驱动 */
                        InterruptDone(g_CardInsertSysIntr);
                }
                else
                {
                        InterruptDone(g_CardInsertSysIntr);
                }       
               
                WaitForSingleObject(hSDEvent, INFINITE);                                /* 等待卡的下一次插入/拨出事件 */
        }

        return 1;
}



/*******************************************************************************************
函数名称: DllEntry
描    述: 驱动程序动态库入口
输入参数:        
输出参数:
返    回:
*******************************************************************************************/
BOOL WINAPI DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch ( dwReason )
        {
                case DLL_PROCESS_ATTACH:
                        RETAILMSG(1, (TEXT("SDMMCLoader: DLL_PROCESS_ATTACH\r\n")));
                        DisableThreadLibraryCalls((HMODULE) hInstDll);
                        break;

                case DLL_PROCESS_DETACH:
                        RETAILMSG(1, (TEXT("SDMMCLoader: DLL_PROCESS_DETACH\r\n")));
                        break;
    }
   
    return (TRUE);
}


/*******************************************************************************************
函数名称: IIC_Init
描    述: 驱动程序初始化函数
输入参数: DWORD dwContext: 设备管理器传递给本驱动的参数, 通常为流接口驱动在注册表内的位置        
输出参数: 无
返    回: 驱动程序句柄
*******************************************************************************************/
DWORD SML_Init(DWORD dwContext)
{
        // 申请硬件寄存器虚拟空间
        SDMMCLoader_InitializeAddresses();

        // 初始化硬件
        InitializeHardware();       

        // 创建卡插入事件
        hSDEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        if(!hSDEvent)
        {
                RETAILMSG( 1, (TEXT("SML_Init: CreateEvent hSDEvent failed, error = %x\r\n"), GetLastError()));
                return FALSE;
        }

    // 向 OAL 层申请硬件中断对应的逻辑中断
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CardInsertIrq, sizeof(UINT32), &g_CardInsertSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: SDMMCLoader: Failed to request sysintr value for SDMMC Card Detect interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: SDMMCLoader: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_CardInsertIrq, g_CardInsertSysIntr));

        // 绑定卡插入逻辑中断到对应的事件
        InterruptDone(g_CardInsertSysIntr);
        InterruptDisable(g_CardInsertSysIntr);
        if (!(InterruptInitialize(g_CardInsertSysIntr, hSDEvent, 0, 0)))
        {
                RETAILMSG(1, (TEXT("ERROR: SDMMCLoader: Interrupt initialize failed.\r\n")));
                return FALSE;
        }

        // 创建卡插入检测线程
        gSDMMCDetectThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) SDMMCDetectThread, NULL, 0, NULL);
        if (gSDMMCDetectThread == NULL )
        {
        RETAILMSG(1, (TEXT("Fatal Error!  Failed to create MMC card detect thread.\r\n")));
        return (FALSE);
        }
               
        RETAILMSG(1, (TEXT(":::SML_Init Sucessfully.\r\n")));
        return TRUE;
}
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 

/*******************************************************************************************
函数名称: SML_Open
描    述: 打开驱动程序
输入参数: DWORD dwData     : 设备驱动程序句柄
          DWORD dwAccess   : 访问请求代码,是读和写的组合
          DWORD dwShareMode: 共享模式  
输出参数:
返    回: 驱动程序引用事例句柄
*******************************************************************************************/
DWORD SML_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
        return 1;
}


/*******************************************************************************************
函数名称: SML_Close
描    述: 驱动程序关闭函数
输入参数: DWORD Handle:驱动程序句柄
输出参数: 无
返    回: FALSE: 失败    TRUE: 成功
*******************************************************************************************/
BOOL SML_Close(DWORD Handle)
{
        return (TRUE);
}


/*******************************************************************************************
函数名称: SML_Read
描    述:
输入参数: DWORD Handle    : 驱动程序引用事例句柄
          LPVOID pBuffer  : 接收缓冲区
          DWORD dwNumBytes: 要读的字节数
输出参数: 无
返    回: 实际读到字节数
*******************************************************************************************/
DWORD SML_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
        return (0);
}


/*******************************************************************************************
函数名称: SML_Write
描    述:
输入参数:
输出参数:
返    回: 成功发送的字节数
*******************************************************************************************/
DWORD SML_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
        return (0);
}


/*******************************************************************************************
函数名称: SML_Seek
描    述: 对设备的数据指针进行操作,本驱动不支持该函数
输入参数:
输出参数:
返    回:
*******************************************************************************************/
DWORD SML_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
        return (DWORD)-1;
}



/*******************************************************************************************
函数名称: SML_PowerUp
描    述: 电源下电驱动处理函数
输入参数:
输出参数:
返    回: 无
*******************************************************************************************/
VOID SML_PowerUp(VOID)
{
        return;
}


/*******************************************************************************************
函数名称: SML_PowerDown
描    述: 电源下电驱动处理函数
输入参数:
输出参数:
返    回: 无
*******************************************************************************************/
BOOL SML_PowerDown(VOID)
{
        RETAILMSG (1, (TEXT("SMLoader Power down end...\r\n")));
        return (TRUE);
}


/*******************************************************************************************
函数名称: SML_Deinit
描    述: 驱动程序卸载函数
输入参数: DWORD dwContext: 驱动程序句柄
输出参数: 无
返    回: FALSE: 失败    TRUE: 成功
*******************************************************************************************/
BOOL  SML_Deinit(DWORD dwData)
{
        return (TRUE);
}


/*******************************************************************************************
函数名称: SML_IOControl
描    述: 驱动程序 I/O 请求
输入参数:
输出参数:
返    回: TRUE: 成功   FALSE: 失败
*******************************************************************************************/
BOOL
SML_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
        return (FALSE);
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表