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); }
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); }