コード例 #1
0
        private void ReadWriteAddrSpace()
        {
            DWORD dwStatus = 0;
            BOOL  bIsBlock = (m_type == TRANSFER_TYPE.BLOCK);
            BOOL  bIsRead  = (m_direction == RW.READ);
            WDC_ADDR_RW_OPTIONS dwOptions = (m_bAutoInc ?
                                             WDC_ADDR_RW_OPTIONS.WDC_ADDR_RW_DEFAULT :
                                             WDC_ADDR_RW_OPTIONS.WDC_ADDR_RW_NO_AUTOINC);
            DWORD dwFloorBytes = ((DWORD)(m_dwBytes / (DWORD)m_mode)) *
                                 (DWORD)m_mode;

            switch (m_mode)
            {
            case WDC_ADDR_MODE.WDC_MODE_8:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_bData,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr8(m_device.Handle,
                                                          m_dwBar, m_dwOffset, ref m_bData[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_bData,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr8(m_device.Handle,
                                                           m_dwBar, m_dwOffset, m_bData[0]);
                }

                m_obj[0] = m_bData;
                break;
            }

            case WDC_ADDR_MODE.WDC_MODE_16:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_wData,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr16(m_device.Handle,
                                                           m_dwBar, m_dwOffset, ref m_wData[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_wData,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr16(m_device.Handle,
                                                            m_dwBar, m_dwOffset, m_wData[0]);
                }

                m_obj[0] = m_wData;
                break;
            }

            case WDC_ADDR_MODE.WDC_MODE_32:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_u32Data,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr32(m_device.Handle,
                                                           m_dwBar, m_dwOffset, ref m_u32Data[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_u32Data,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr32(m_device.Handle,
                                                            m_dwBar, m_dwOffset, m_u32Data[0]);
                }

                m_obj[0] = m_u32Data;
                break;
            }

            case WDC_ADDR_MODE.WDC_MODE_64:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_u64Data,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr64(m_device.Handle,
                                                           m_dwBar, m_dwOffset, ref m_u64Data[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_u64Data,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr64(m_device.Handle,
                                                            m_dwBar, m_dwOffset, m_u64Data[0]);
                }

                m_obj[0] = m_u64Data;
                break;
            }
            }

            TraceLog(bIsRead, (wdc_err)dwStatus);
        }
コード例 #2
0
        private void ReadWriteAddrSpace()
        {
            DWORD dwStatus = 0;
            BOOL  bIsBlock = (m_type == TRANSFER_TYPE.BLOCK); //判断是否是锁定模式
            BOOL  bIsRead  = (m_direction == RW.READ);        //判断是读还是写
            WDC_ADDR_RW_OPTIONS dwOptions = (m_bAutoInc ?
                                                              //读写模式 自动增长 如果为默认模式 那么会自动按照这个地址逐渐增长 如果是no_autoinc模式那么不要在块传输中自动增加读/写地址,
                                                              //即在读/写一块存储器或I / O地址(仅与块(串)传输相关)时保持设备地址不变。
                                             WDC_ADDR_RW_OPTIONS.WDC_ADDR_RW_DEFAULT :
                                             WDC_ADDR_RW_OPTIONS.WDC_ADDR_RW_NO_AUTOINC);

            /*WDC_ADDR_RW_NO_AUTOINC Do no automatically increment the read/write address
             * in block transfers, i.e., hold the device address constant
             * while reading / writing a block of memory or I/ O
             * addresses(relevant only for block(string) transfers).*/
            DWORD dwFloorBytes = ((DWORD)(m_dwBytes / (DWORD)m_mode)) *
                                 (DWORD)m_mode;//??????????

            switch (m_mode)
            {
            case WDC_ADDR_MODE.WDC_MODE_8:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,                            //B.3.24. WDC_ReadAddrBlock()  Reads a block of data from the device.
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_bData, //m_dwOffset  The offset from the beginning of the specified address space(dwAddrSpace) to read from
                                                              m_mode, dwOptions) :                        //从指定地址空间(dwAddrSpace)开始的偏移量从中读取
                               wdc_lib_decl.WDC_ReadAddr8(m_device.Handle,
                                                          m_dwBar, m_dwOffset, ref m_bData[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_bData,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr8(m_device.Handle,
                                                           m_dwBar, m_dwOffset, m_bData[0]);//对于nonblock而言 只有一个为说以要加[0]
                }
                m_obj[0] = m_bData;
                break;
            }

            case WDC_ADDR_MODE.WDC_MODE_16:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_wData,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr16(m_device.Handle,
                                                           m_dwBar, m_dwOffset, ref m_wData[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_wData,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr16(m_device.Handle,
                                                            m_dwBar, m_dwOffset, m_wData[0]);
                }

                m_obj[0] = m_wData;     //将输入数组输入  object类
                break;
            }

            case WDC_ADDR_MODE.WDC_MODE_32:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_u32Data,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr32(m_device.Handle,
                                                           m_dwBar, m_dwOffset, ref m_u32Data[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_u32Data,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr32(m_device.Handle,
                                                            m_dwBar, m_dwOffset, m_u32Data[0]);
                }

                m_obj[0] = m_u32Data;
                break;
            }

            case WDC_ADDR_MODE.WDC_MODE_64:
            {
                if (bIsRead)
                {
                    dwStatus = bIsBlock ?
                               wdc_lib_decl.WDC_ReadAddrBlock(m_device.Handle,
                                                              m_dwBar, m_dwOffset, dwFloorBytes, m_u64Data,
                                                              m_mode, dwOptions) :
                               wdc_lib_decl.WDC_ReadAddr64(m_device.Handle,
                                                           m_dwBar, m_dwOffset, ref m_u64Data[0]);
                }
                else
                {
                    dwStatus = bIsBlock?
                               wdc_lib_decl.WDC_WriteAddrBlock(m_device.Handle,
                                                               m_dwBar, m_dwOffset, dwFloorBytes, m_u64Data,
                                                               m_mode, dwOptions) :
                               wdc_lib_decl.WDC_WriteAddr64(m_device.Handle,
                                                            m_dwBar, m_dwOffset, m_u64Data[0]);
                }

                m_obj[0] = m_u64Data;
                break;
            }
            }

            TraceLog(bIsRead, (wdc_err)dwStatus);
        }