manually merged with ARM version
This commit is contained in:
48
l502/CMakeLists.txt
Normal file
48
l502/CMakeLists.txt
Normal file
@ -0,0 +1,48 @@
|
||||
cmake_minimum_required(VERSION 2.8.12)
|
||||
|
||||
project(l502api C)
|
||||
set(PROJECT_VARNAME_PREFIX L502API)
|
||||
|
||||
|
||||
|
||||
include(${LTIMER_DIR}/ltimer.cmake)
|
||||
|
||||
set(SOURCES
|
||||
l502api.c
|
||||
l502api_compat.c
|
||||
l502api_eeprom.c
|
||||
l502api_bf.c
|
||||
${LTIMER_SOURCES}
|
||||
)
|
||||
|
||||
set(SETUP_HEADERS
|
||||
l502api.h
|
||||
l502api_compat.h)
|
||||
|
||||
set(HEADERS
|
||||
l502api_private.h
|
||||
lpcie_ioctls.h
|
||||
${LTIMER_HEADERS})
|
||||
|
||||
set(LIBS
|
||||
x502api
|
||||
${LTIMER_LIBS})
|
||||
|
||||
set(L502API_COMPILE_DEFINITIONS ${L502API_COMPILE_DEFINITIONS} ${LTIMER_DEFINITIONS})
|
||||
|
||||
if(WIN32)
|
||||
#В Windows используем setupapi для нахождения устройства
|
||||
set(LIBS ${LIBS} setupapi)
|
||||
set(SOURCES ${SOURCES} win/l502_spec.c)
|
||||
elseif(UNIX)
|
||||
set(SOURCES ${SOURCES} linux/l502_spec.c)
|
||||
endif(WIN32)
|
||||
|
||||
include(${X502_LIBS_CMAKE_FILE})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
212
l502/l502_fpga_regs.h
Normal file
212
l502/l502_fpga_regs.h
Normal file
@ -0,0 +1,212 @@
|
||||
#ifndef L5XX_REGS_H
|
||||
#define L5XX_REGS_H
|
||||
|
||||
#define L583_BF_ADDR_ENDPROG (0xFFFFFFFCUL)
|
||||
|
||||
|
||||
#define L502_MAX_PAGES_CNT 252
|
||||
|
||||
#define L502_BF_SDRAM_SIZE (32UL*1024*1024)
|
||||
|
||||
#define L502_BF_MEMADDR_CMD 0xFF800800
|
||||
|
||||
|
||||
#define L502_BF_CMD_READ 0x0001
|
||||
#define L502_BF_CMD_WRITE 0x0002
|
||||
#define L502_BF_CMD_HIRQ 0x0004
|
||||
#define L502_BF_CMD_HDMA_RST 0x0008
|
||||
|
||||
|
||||
/********************* Адреса регистров блока EEPROM *************************/
|
||||
#define L502_REGS_EEPROM_BLOCK 0x0100
|
||||
|
||||
#define L502_REGS_EEPROM_SET_RD_ADDR (L502_REGS_EEPROM_BLOCK + 0)
|
||||
#define L502_REGS_EEPROM_RD_DWORD (L502_REGS_EEPROM_BLOCK + 1)
|
||||
#define L502_REGS_EEPROM_RD_STATUS (L502_REGS_EEPROM_BLOCK + 2)
|
||||
#define L502_REGS_EEPROM_WR_STATUS_EN (L502_REGS_EEPROM_BLOCK + 3)
|
||||
#define L502_REGS_EEPROM_WR_EN (L502_REGS_EEPROM_BLOCK + 4)
|
||||
#define L502_REGS_EEPROM_WR_DIS (L502_REGS_EEPROM_BLOCK + 5)
|
||||
#define L502_REGS_EEPROM_WR_STATUS (L502_REGS_EEPROM_BLOCK + 6)
|
||||
#define L502_REGS_EEPROM_ERASE_4K (L502_REGS_EEPROM_BLOCK + 7)
|
||||
#define L502_REGS_EEPROM_ERASE_64K (L502_REGS_EEPROM_BLOCK + 8)
|
||||
#define L502_REGS_EEPROM_WR_BYTE (L502_REGS_EEPROM_BLOCK + 9)
|
||||
#define L502_REGS_EEPROM_HARD_WR_STATUS_EN (L502_REGS_EEPROM_BLOCK + 0xF)
|
||||
#define L502_REGS_HARD_ID (L502_REGS_EEPROM_BLOCK + 0xA)
|
||||
#define L502_REGS_JEDEC_RD_ID (L502_REGS_EEPROM_BLOCK + 0xB)
|
||||
|
||||
/********************* Адреса регистров с отладочной информацией **************/
|
||||
#define L502_REGS_DBG_BLOCK 0x0140
|
||||
#define L502_REGS_DBG_EVENTS (L502_REGS_DBG_BLOCK + 0)
|
||||
#define L502_REGS_DBG_LAST_ABORT_ADDR (L502_REGS_DBG_BLOCK + 8)
|
||||
#define L502_REGS_DBG_LAST_NACK_ADDR (L502_REGS_DBG_BLOCK + 9)
|
||||
#define L502_REGS_DBG_LINK_REPLAY_CNT (L502_REGS_DBG_BLOCK + 10)
|
||||
|
||||
/********************* Адреса регистров блока IOHARD **************************/
|
||||
#define L502_REGS_IOHARD_BLOCK 0x0200
|
||||
//Адрес Control Table
|
||||
#define L502_REGS_IOHARD_LTABLE (L502_REGS_IOHARD_BLOCK+0)
|
||||
#define L502_REGS_IOHARD_LTABLE_MAX_SIZE 0x100 // Максимальный размер Control Table
|
||||
|
||||
#define L502_REGS_IOHARD_LCH_CNT (L502_REGS_IOHARD_BLOCK+0x100)
|
||||
#define L502_REGS_IOHARD_ADC_FREQ_DIV (L502_REGS_IOHARD_BLOCK+0x102)
|
||||
#define L502_REGS_IOHARD_ADC_FRAME_DELAY (L502_REGS_IOHARD_BLOCK+0x104)
|
||||
#define L502_REGS_IOHARD_DIGIN_FREQ_DIV (L502_REGS_IOHARD_BLOCK+0x106)
|
||||
#define L502_REGS_IOHARD_IO_MODE (L502_REGS_IOHARD_BLOCK+0x108)
|
||||
#define L502_REGS_IOHARD_GO_SYNC_IO (L502_REGS_IOHARD_BLOCK+0x10A)
|
||||
#define L502_REGS_IOHARD_PRELOAD_ADC (L502_REGS_IOHARD_BLOCK+0x10C)
|
||||
#define L502_REGS_IOHARD_ASYNC_OUT (L502_REGS_IOHARD_BLOCK+0x112)
|
||||
#define L502_REGS_IOHARD_LED (L502_REGS_IOHARD_BLOCK+0x114)
|
||||
#define L502_REGS_IOHARD_DIGIN_PULLUP (L502_REGS_IOHARD_BLOCK+0x116)
|
||||
#define L502_REGS_IOHARD_OUTSWAP_BFCTL (L502_REGS_IOHARD_BLOCK+0x118)
|
||||
#define L502_REGS_IOHARD_OUTSWAP_ERROR (L502_REGS_IOHARD_BLOCK+0x120)
|
||||
|
||||
|
||||
|
||||
/********************* Адреса регистров блока IOARITH **************************/
|
||||
#define L502_REGS_IOARITH_BLOCK 0x0400
|
||||
#define L502_REGS_IOARITH_B10 L502_REGS_IOARITH_BLOCK
|
||||
#define L502_REGS_IOARITH_B5 (L502_REGS_IOARITH_BLOCK+0x01)
|
||||
#define L502_REGS_IOARITH_B2 (L502_REGS_IOARITH_BLOCK+0x02)
|
||||
#define L502_REGS_IOARITH_B1 (L502_REGS_IOARITH_BLOCK+0x03)
|
||||
#define L502_REGS_IOARITH_B05 (L502_REGS_IOARITH_BLOCK+0x04)
|
||||
#define L502_REGS_IOARITH_B02 (L502_REGS_IOARITH_BLOCK+0x05)
|
||||
#define L502_REGS_IOARITH_K10 (L502_REGS_IOARITH_BLOCK+0x08)
|
||||
#define L502_REGS_IOARITH_K5 (L502_REGS_IOARITH_BLOCK+0x09)
|
||||
#define L502_REGS_IOARITH_K2 (L502_REGS_IOARITH_BLOCK+0x0A)
|
||||
#define L502_REGS_IOARITH_K1 (L502_REGS_IOARITH_BLOCK+0x0B)
|
||||
#define L502_REGS_IOARITH_K05 (L502_REGS_IOARITH_BLOCK+0x0C)
|
||||
#define L502_REGS_IOARITH_K02 (L502_REGS_IOARITH_BLOCK+0x0D)
|
||||
#define L502_REGS_IOARITH_ADC_FREQ_DIV (L502_REGS_IOARITH_BLOCK+0x12)
|
||||
#define L502_REGS_IOARITH_IN_STREAM_ENABLE (L502_REGS_IOARITH_BLOCK+0x19)
|
||||
#define L502_REGS_IOARITH_DIN_ASYNC (L502_REGS_IOARITH_BLOCK+0x1A)
|
||||
|
||||
|
||||
/********************* Адреса регистров блока управления BlackFin'ом **********/
|
||||
#define L502_REGS_BF_CTL_BLOCK 0
|
||||
#define L502_REGS_BF_CTL (L502_REGS_BF_CTL_BLOCK+0)
|
||||
#define L502_REGS_BF_CMD (L502_REGS_BF_CTL_BLOCK+1)
|
||||
#define L502_REGS_BF_STATUS (L502_REGS_BF_CTL_BLOCK+2)
|
||||
#define L502_REGS_BF_IRQ (L502_REGS_BF_CTL_BLOCK+3)
|
||||
#define L502_REGS_BF_IRQ_EN (L502_REGS_BF_CTL_BLOCK+4)
|
||||
#define L502_REGS_BF_REQ_ADDR (L502_REGS_BF_CTL_BLOCK+5)
|
||||
#define L502_REGS_BF_REQ_SIZE (L502_REGS_BF_CTL_BLOCK+6)
|
||||
#define L502_REGS_BF_REQ_DATA (L502_REGS_BF_CTL_BLOCK+128)
|
||||
|
||||
#define L502_BF_REQ_DATA_SIZE_MAX 128
|
||||
#define L502_BF_REQ_DATA_SIZE_MIN 8
|
||||
|
||||
|
||||
/********************* Адреса регистров блока DMA *****************************/
|
||||
#define L502_REGS_DMA_CTL_BLOCK 0x700
|
||||
#define L502_REGS_DMA_CAP (L502_REGS_DMA_CTL_BLOCK)
|
||||
#define L502_REGS_DMA_EN (L502_REGS_DMA_CTL_BLOCK+1)
|
||||
#define L502_REGS_DMA_DIS (L502_REGS_DMA_CTL_BLOCK+2)
|
||||
#define L502_REGS_DMA_RST (L502_REGS_DMA_CTL_BLOCK+3)
|
||||
#define L502_REGS_DMA_IRQ (L502_REGS_DMA_CTL_BLOCK+4)
|
||||
#define L502_REGS_DMA_IRQ_EN (L502_REGS_DMA_CTL_BLOCK+5)
|
||||
#define L502_REGS_DMA_IRQ_DIS (L502_REGS_DMA_CTL_BLOCK+6)
|
||||
|
||||
#define L502_REGS_DMA_CH_PARAMS_SIZE (16 + L502_MAX_PAGES_CNT*4)
|
||||
#define L502_DMA_CHNUM_IN 0
|
||||
#define L502_DMA_CHNUM_OUT 1
|
||||
|
||||
/* номер регистра, с которого начинаются параметры канала DMA */
|
||||
#define L502_REGS_DMA_CH_PARAMS(ch) (0x800 + L502_REGS_DMA_CH_PARAMS_SIZE*ch)
|
||||
#define L502_REGS_DMA_CH_CTL(ch) (L502_REGS_DMA_CH_PARAMS(ch) + 0)
|
||||
#define L502_REGS_DMA_CH_CMP_CNTR(ch) (L502_REGS_DMA_CH_PARAMS(ch) + 1)
|
||||
#define L502_REGS_DMA_CH_CUR_CNTR(ch) (L502_REGS_DMA_CH_PARAMS(ch) + 2)
|
||||
#define L502_REGS_DMA_CH_CUR_POS(ch) (L502_REGS_DMA_CH_PARAMS(ch) + 3)
|
||||
#define L502_REGS_DMA_CH_PC_POS(ch) (L502_REGS_DMA_CH_PARAMS(ch) + 4)
|
||||
|
||||
|
||||
/* адреса для регистров страниц DMA АЦП */
|
||||
#define L502_REGS_DMA_CH_PAGES(ch) (L502_REGS_DMA_CH_PARAMS(ch) + 16)
|
||||
#define L502_REGS_DMA_CH_PAGE_ADDRL(ch,n) (L502_REGS_DMA_CH_PAGES(ch) + 4*(n))
|
||||
#define L502_REGS_DMA_CH_PAGE_ADDRH(ch,n) (L502_REGS_DMA_CH_PAGES(ch) + 4*(n)+1)
|
||||
#define L502_REGS_DMA_CH_PAGE_LEN(ch,n) (L502_REGS_DMA_CH_PAGES(ch) + 4*(n)+2)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define L502_REGBIT_BF_STATUS_HWAIT_Pos 0
|
||||
#define L502_REGBIT_BF_STATUS_HWAIT_Msk (1UL << L502_REGBIT_BF_STATUS_HWAIT_Pos)
|
||||
|
||||
#define L502_REGBIT_BF_STATUS_BUSY_Pos 1
|
||||
#define L502_REGBIT_BF_STATUS_BUSY_Msk (1UL << L502_REGBIT_BF_STATUS_BUSY_Pos)
|
||||
|
||||
|
||||
/* описание отдельных битов регистров */
|
||||
#define L502_REGBIT_DMA_CTL_PACK_SIZE_Pos 0
|
||||
#define L502_REGBIT_DMA_CTL_PACK_SIZE_Msk (0xFFUL << L502_REGBIT_DMA_CTL_PACK_SIZE_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CTL_PAGE_CNT_Pos 16
|
||||
#define L502_REGBIT_DMA_CTL_PAGE_CNT_Msk (0xFFUL << L502_REGBIT_DMA_CTL_PAGE_CNT_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CTL_AUTOSTOP_Pos 31
|
||||
#define L502_REGBIT_DMA_CTL_AUTOSTOP_Msk (0x1UL << L502_REGBIT_DMA_CTL_AUTOSTOP_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CTL_PC_WAIT_Pos 30
|
||||
#define L502_REGBIT_DMA_CTL_PC_WAIT_Msk (0x1UL << L502_REGBIT_DMA_CTL_PC_WAIT_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CH_ADC_Pos 0
|
||||
#define L502_REGBIT_DMA_CH_ADC_Msk (0x1UL << L502_REGBIT_DMA_CH_ADC_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CH_DAC_Pos 1
|
||||
#define L502_REGBIT_DMA_CH_DAC_Msk (0x1UL << L502_REGBIT_DMA_CH_DAC_Pos)
|
||||
|
||||
|
||||
|
||||
#define L502_REGBIT_BF_CTL_BF_RESET_Pos 1
|
||||
#define L502_REGBIT_BF_CTL_BF_RESET_Msk (0x1UL << L502_REGBIT_BF_CTL_BF_RESET_Pos)
|
||||
|
||||
|
||||
#define L502_REGBIT_BF_CTL_HOST_WAIT_Pos 3
|
||||
#define L502_REGBIT_BF_CTL_HOST_WAIT_Msk (0x1UL << L502_REGBIT_BF_CTL_HOST_WAIT_Pos)
|
||||
|
||||
#define L502_REGBIT_BF_CTL_DSP_MODE_Pos 4
|
||||
#define L502_REGBIT_BF_CTL_DSP_MODE_Msk (0x1UL << L502_REGBIT_BF_CTL_DSP_MODE_Pos)
|
||||
|
||||
#define L502_REGBIT_BF_CTL_DBG_MODE_Pos 5
|
||||
#define L502_REGBIT_BF_CTL_DBG_MODE_Msk (0x1UL << L502_REGBIT_BF_CTL_DBG_MODE_Pos)
|
||||
|
||||
#define L502_REGBIT_BF_CTL_CLK_DIV_Pos 8
|
||||
#define L502_REGBIT_BF_CTL_CLK_DIV_Msk (0xFUL << L502_REGBIT_BF_CTL_CLK_DIV_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CURPOS_PAGE_Pos 24
|
||||
#define L502_REGBIT_DMA_CURPOS_PAGE_Msk (0xFFUL << L502_REGBIT_DMA_CURPOS_PAGE_Pos)
|
||||
|
||||
#define L502_REGBIT_DMA_CURPOS_OFFSET_Pos 0
|
||||
#define L502_REGBIT_DMA_CURPOS_OFFSET_Msk (0xFFFFFFUL << L502_REGBIT_DMA_CURPOS_OFFSET_Pos)
|
||||
|
||||
#define L502_REGBIT_ADC_SLV_CLK_LOCK_Pos 31
|
||||
#define L502_REGBIT_ADC_SLV_CLK_LOCK_Msk (0x1UL << L502_REGBIT_ADC_SLV_CLK_LOCK_Pos)
|
||||
|
||||
|
||||
|
||||
#define L502_REGBIT_IOHARD_OUT_SWAP_Pos 0
|
||||
#define L502_REGBIT_IOHARD_OUT_SWAP_Msk (0x1UL << L502_REGBIT_IOHARD_OUT_SWAP_Pos)
|
||||
|
||||
#define L502_REGBIT_IOHARD_OUT_TFS_EN_Pos 1
|
||||
#define L502_REGBIT_IOHARD_OUT_TFS_EN_Msk (0x1UL << L502_REGBIT_IOHARD_OUT_TFS_EN_Pos)
|
||||
|
||||
#define L502_REGBIT_IOHARD_OUT_RING_Pos 2
|
||||
#define L502_REGBIT_IOHARD_OUT_RING_Msk (0x1UL << L502_REGBIT_IOHARD_OUT_RING_Pos)
|
||||
|
||||
#define L502_REGBIT_IOHARD_OUT_RFS_EN_Pos 3
|
||||
#define L502_REGBIT_IOHARD_OUT_RFS_EN_Msk (0x1UL << L502_REGBIT_IOHARD_OUT_RFS_EN_Pos)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define L502_REGBIT_DMA_IRQ_STEP_Msk(ch) (1UL << ch)
|
||||
#define L502_REGBIT_DMA_IRQ_PAGE_Msk(ch) (1UL << (ch+8))
|
||||
#define L502_REGBIT_DMA_IRQ_FLUSH_Msk(ch) (1UL << (ch+16))
|
||||
|
||||
|
||||
|
||||
#endif // L5XX_REGS_H
|
||||
164
l502/l502api.c
Normal file
164
l502/l502api.c
Normal file
@ -0,0 +1,164 @@
|
||||
#include "l502api.h"
|
||||
#include "l502api_private.h"
|
||||
#include "l502_fpga_regs.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* минимальный размер внутреннего буфера */
|
||||
#define L502_DMA_IN_BUF_SIZE_MIN 16*1024
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
BOOL WINAPI DllMain(HINSTANCE hmod, DWORD reason, LPVOID resvd) {
|
||||
switch (reason) {
|
||||
case DLL_PROCESS_ATTACH:
|
||||
case DLL_THREAD_ATTACH:
|
||||
case DLL_THREAD_DETACH:
|
||||
case DLL_PROCESS_DETACH:
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int32_t f_iface_free_devinfo_ptr(t_x502_devrec_inptr *devinfo_ptr);
|
||||
static int32_t f_iface_stream_cfg(t_x502_hnd hnd, uint32_t ch, t_x502_stream_ch_params *params);
|
||||
static int32_t f_iface_cycle_load_start(t_x502_hnd hnd, uint32_t size);
|
||||
static int32_t f_iface_cycle_setup(t_x502_hnd hnd, uint32_t flags);
|
||||
static int32_t f_iface_cycle_stop(t_x502_hnd hnd, uint32_t flags);
|
||||
static int32_t f_iface_cycle_check_setup(t_x502_hnd hnd, uint32_t *done);
|
||||
static int32_t f_iface_check_feature(t_x502_hnd hnd, uint32_t feature);
|
||||
|
||||
|
||||
static const t_x502_dev_iface f_pcie_iface = {
|
||||
L502_REGS_HARD_ID,
|
||||
L502_DMA_IN_BUF_SIZE_MIN,
|
||||
0,
|
||||
L502_BF_REQ_DATA_SIZE_MAX,
|
||||
4, //flash rd size
|
||||
1, //flash wr size
|
||||
f_iface_free_devinfo_ptr,
|
||||
l502_port_open,
|
||||
l502_port_close,
|
||||
l502_port_fpga_reg_read,
|
||||
l502_port_fpga_reg_write,
|
||||
f_iface_stream_cfg,
|
||||
l502_port_stream_start,
|
||||
l502_port_stream_stop,
|
||||
l502_port_stream_free,
|
||||
NULL,
|
||||
l502_port_stream_read,
|
||||
l502_port_stream_write,
|
||||
l502_port_stream_rdy_size,
|
||||
l502_iface_bf_mem_block_rd,
|
||||
l502_iface_bf_mem_block_wr,
|
||||
l502_iface_bf_firm_load,
|
||||
l502_iface_flash_rd,
|
||||
l502_iface_flash_wr,
|
||||
l502_iface_flash_erase,
|
||||
l502_iface_flash_set_prot,
|
||||
l502_port_renew_info,
|
||||
f_iface_cycle_load_start,
|
||||
f_iface_cycle_setup,
|
||||
f_iface_cycle_stop,
|
||||
f_iface_cycle_check_setup,
|
||||
NULL,
|
||||
NULL,
|
||||
f_iface_check_feature
|
||||
};
|
||||
|
||||
|
||||
X502_EXPORT(int32_t) L502_GetDriverVersion(t_x502_hnd hnd, uint32_t* ver) {
|
||||
int32_t err = X502_CHECK_HND(hnd);
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_get_drv_ver(hnd, ver);
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_devlist_gen(t_x502_devrec *info, void *iface_data) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
t_x502_devrec_inptr *devinfo_ptr = calloc(1, sizeof(t_x502_devrec_inptr));
|
||||
if (devinfo_ptr == NULL) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
} else {
|
||||
devinfo_ptr->iface_data = iface_data;
|
||||
devinfo_ptr->iface = &f_pcie_iface;
|
||||
info->iface = X502_IFACE_PCI;
|
||||
info->flags |= X502_DEVFLAGS_IFACE_SUPPORT_PCI | X502_DEVFLAGS_FPGA_LOADED;
|
||||
info->internal = devinfo_ptr;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
X502_EXPORT(int32_t) L502_GetSerialList(char serials[][X502_SERIAL_SIZE], uint32_t size,
|
||||
uint32_t flags, uint32_t *devcnt) {
|
||||
return X502_GetSerialList(serials, size, flags, devcnt, L502_DEVICE_NAME, L502_GetDevRecordsList);
|
||||
}
|
||||
|
||||
X502_EXPORT(int32_t) L502_Open(t_x502_hnd hnd, const char *serial) {
|
||||
return X502_Open(hnd, serial, L502_DEVICE_NAME, L502_GetDevRecordsList);
|
||||
}
|
||||
|
||||
|
||||
static int32_t f_iface_free_devinfo_ptr(t_x502_devrec_inptr *devinfo_ptr) {
|
||||
l502_port_free_iface_data(devinfo_ptr->iface_data);
|
||||
free(devinfo_ptr);
|
||||
return X502_ERR_OK;
|
||||
}
|
||||
|
||||
static int32_t f_iface_stream_cfg(t_x502_hnd hnd, uint32_t ch, t_x502_stream_ch_params *params) {
|
||||
t_lpcie_stream_ch_params lpcie_ch_params;
|
||||
memset(&lpcie_ch_params, 0, sizeof(lpcie_ch_params));
|
||||
lpcie_ch_params.ch = ch;
|
||||
lpcie_ch_params.irq_step = params->step;
|
||||
lpcie_ch_params.buf_size = params->buf_size;
|
||||
return l502_port_stream_set_params(hnd, &lpcie_ch_params);
|
||||
}
|
||||
|
||||
static int32_t f_iface_cycle_load_start(t_x502_hnd hnd, uint32_t size) {
|
||||
uint32_t irq_step = STREAM_OUT_IRQ_STEP(hnd);
|
||||
return l502_port_cycle_load_start(hnd, L502_DMA_CHNUM_OUT, size, irq_step);
|
||||
}
|
||||
static int32_t f_iface_cycle_setup(t_x502_hnd hnd, uint32_t flags) {
|
||||
return l502_port_cycle_setup(hnd, L502_DMA_CHNUM_OUT, (flags & X502_OUT_CYCLE_FLAGS_FORCE) ?
|
||||
LPCIE_CYCLE_SW_EVT_IMMIDIATLY : LPCIE_CYCLE_SW_EVT_END_OF_CYCLE);
|
||||
}
|
||||
|
||||
static int32_t f_iface_cycle_stop(t_x502_hnd hnd, uint32_t flags) {
|
||||
return l502_port_cycle_stop(hnd, L502_DMA_CHNUM_OUT, (flags & X502_OUT_CYCLE_FLAGS_FORCE) ?
|
||||
LPCIE_CYCLE_SW_EVT_IMMIDIATLY : LPCIE_CYCLE_SW_EVT_END_OF_CYCLE);
|
||||
}
|
||||
|
||||
static int32_t f_iface_cycle_check_setup(t_x502_hnd hnd, uint32_t *done) {
|
||||
uint32_t ver;
|
||||
int32_t err = L502_GetDriverVersion(hnd, &ver);
|
||||
if ((err == X502_ERR_OK) && !LPCIE_IOCTL_SUPPORT_CYCLE_CHECK_SETUP(ver))
|
||||
err = X502_ERR_NOT_SUP_BY_DRIVER;
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_cycle_check_setup(hnd, L502_DMA_CHNUM_OUT, done);
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
/* за счет буфера в плате на вывод может пройти несколько мс после
|
||||
* передачи в модуль данных до того как реально эти данные появятся
|
||||
* на выходе. т.к. это отследить явно нельзя, то приходится ставить задержку */
|
||||
SLEEP_MS(3);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int32_t f_iface_check_feature(t_x502_hnd hnd, uint32_t feature) {
|
||||
int32_t err = X502_ERR_NOT_SUP_BY_FIRMWARE;
|
||||
switch (feature) {
|
||||
case X502_FEATURE_OUT_FREQ_DIV:
|
||||
case X502_FEATURE_OUT_STATUS_FLAGS:
|
||||
if (hnd->info.fpga_ver >= 0x5)
|
||||
err = X502_ERR_OK;
|
||||
break;
|
||||
default:
|
||||
err = X502_ERR_UNKNOWN_FEATURE_CODE;
|
||||
break;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
72
l502/l502api.def
Normal file
72
l502/l502api.def
Normal file
@ -0,0 +1,72 @@
|
||||
LIBRARY l502api.dll
|
||||
|
||||
EXPORTS
|
||||
L502_Create
|
||||
L502_Free
|
||||
L502_Open
|
||||
L502_Close
|
||||
L502_GetSerialList
|
||||
L502_GetDevInfo
|
||||
L502_Configure
|
||||
L502_StreamsEnable
|
||||
L502_StreamsDisable
|
||||
L502_StreamsStart
|
||||
L502_StreamsStop
|
||||
L502_IsRunning
|
||||
L502_Recv
|
||||
L502_Send
|
||||
L502_GetRecvReadyCount
|
||||
L502_GetSendReadyCount
|
||||
L502_SetDmaBufSize
|
||||
L502_SetDmaIrqStep
|
||||
L502_GetNextExpectedLchNum
|
||||
L502_PreloadStart
|
||||
L502_ProcessAdcData
|
||||
L502_ProcessData
|
||||
L502_ProcessDataWithUserExt
|
||||
L502_PrepareData
|
||||
L502_SetLChannel
|
||||
L502_SetLChannelCount
|
||||
L502_GetLChannelCount
|
||||
L502_SetAdcFreqDivider
|
||||
L502_SetAdcInterframeDelay
|
||||
L502_SetDinFreqDivider
|
||||
L502_SetAdcFreq
|
||||
L502_SetDinFreq
|
||||
L502_GetAdcFreq
|
||||
L502_SetRefFreq
|
||||
L502_SetSyncMode
|
||||
L502_SetSyncStartMode
|
||||
L502_SetMode
|
||||
L502_GetMode
|
||||
L502_SetAdcCoef
|
||||
L502_GetAdcCoef
|
||||
L502_SetDacCoef
|
||||
L502_GetDacCoef
|
||||
L502_AsyncOutDac
|
||||
L502_AsyncOutDig
|
||||
L502_AsyncInDig
|
||||
L502_AsyncGetAdcFrame
|
||||
L502_BfCheckFirmwareIsLoaded
|
||||
L502_BfLoadFirmware
|
||||
L502_BfMemRead
|
||||
L502_BfMemWrite
|
||||
L502_BfExecCmd
|
||||
L502_FlashRead
|
||||
L502_FlashWrite
|
||||
L502_FlashErase
|
||||
L502_FlashWriteEnable
|
||||
L502_FlashWriteDisable
|
||||
L502_FpgaRegWrite
|
||||
L502_FpgaRegRead
|
||||
L502_GetDllVersion
|
||||
L502_GetDriverVersion
|
||||
L502_GetErrorString
|
||||
L502_LedBlink
|
||||
L502_SetDigInPullup
|
||||
L502_ReloadDevInfo
|
||||
L502_OutCycleLoadStart
|
||||
L502_OutCycleSetup
|
||||
L502_OutCycleStop
|
||||
L502_GetDevRecordsList
|
||||
|
||||
162
l502/l502api.h
Normal file
162
l502/l502api.h
Normal file
@ -0,0 +1,162 @@
|
||||
/***************************************************************************//**
|
||||
@file l502api.h
|
||||
Файл содержит все необходимые описания типов, констант и функций для работы
|
||||
с модулем L-502 из пользовательской программы.
|
||||
@date 11.03.2012
|
||||
@author Borisov Alexey <borisov@lcard.ru>
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef L502_API_H
|
||||
#define L502_API_H
|
||||
|
||||
#include "l502api_compat.h"
|
||||
#include "x502api.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***************************************************************************//**
|
||||
@addtogroup func_open
|
||||
@{
|
||||
*******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
@brief Получение списка серийных номеров модулей L-502
|
||||
|
||||
Функция возвращает список номеров всех найденных модулей L-502, независимо от
|
||||
того, открыты они сейчас или нет.
|
||||
|
||||
Если нужен список только тех модулей, которые не открыты (то есть
|
||||
только тех, с которыми можно установить соединение), то для этого можно
|
||||
передать в функцию флаг #X502_GETDEVS_FLAGS_ONLY_NOT_OPENED.
|
||||
|
||||
@param[in] serials Массив размером size*#X502_SERIAL_SIZE байт, в который
|
||||
будут сохранены серийные номера найденных модулей.
|
||||
Может быть NULL, если size=0, а devcnt!=NULL, в случае,
|
||||
если нужно только получить количество модулей в системе.
|
||||
@param[in] size Определяет, сколько максимально серийных номеров может
|
||||
быть сохранено в массив serial. Будут сохранены только
|
||||
первые size серийных номеров.
|
||||
Может быть 0, если serials=NULL
|
||||
@param[in] flags Флаги из #t_x502_getdevs_flags, определяющие поведение
|
||||
функции.
|
||||
@param[out] devcnt Если devcnt!=NULL, то в данную переменную сохраняется
|
||||
общее число найденных модулей L502
|
||||
(может быть больше size).
|
||||
@return Если <0 - код ошибки, иначе количество сохраненных
|
||||
серийных номеров в массиве serials (всегда <= size)
|
||||
*******************************************************************************/
|
||||
X502_EXPORT(int32_t) L502_GetSerialList(char serials[][X502_SERIAL_SIZE], uint32_t size,
|
||||
uint32_t flags, uint32_t *devcnt);
|
||||
|
||||
/***************************************************************************//**
|
||||
@brief Открытие модуля L-502 по его серийному номеру
|
||||
|
||||
Функция устанавливает связь с модулем L-502 по его серийному номеру.
|
||||
После успешного выполнения этой функции, пользователь получает эксклюзивный
|
||||
доступ к модулю через описатель модуля. До закрытия связи с помощью
|
||||
X502_Close() никто другой установить связь с модулем не сможет
|
||||
(будет возвращена ошибка #X502_ERR_DEVICE_ACCESS_DENIED).
|
||||
|
||||
Если в качестве серийного номера передан NULL или пустая строка, то будет
|
||||
установлена связь с первым найденным модулем, с которым получится успешно
|
||||
ее установить.
|
||||
Если в системе нет ни одного модуля, то будет возвращена ошибка
|
||||
#X502_ERR_DEVICE_NOT_FOUND. Если в системе присутствуют модули L-502, но
|
||||
соединение ни с одним из них установить не удалось, то будет возвращена
|
||||
ошибка, полученная при попытке установить соединение с последним
|
||||
найденным модулем.
|
||||
|
||||
После завершения работы с устройством соединение должно быть закрыто с
|
||||
помощью X502_Close().
|
||||
|
||||
@param[in] hnd Описатель устройства.
|
||||
@param[in] serial Указатель на строку с серийным номером открываемого
|
||||
модуля или NULL.
|
||||
@return Код ошибки.
|
||||
*******************************************************************************/
|
||||
X502_EXPORT(int32_t) L502_Open(t_x502_hnd hnd, const char *serial);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
@addtogroup func_devrec
|
||||
@{
|
||||
*******************************************************************************/
|
||||
|
||||
/***************************************************************************//**
|
||||
@brief Получить список записей, соответствующих подключенным модулям L502
|
||||
|
||||
Функция находит все подключенные модули L-502 и инициализирует
|
||||
записи о каждом найденном устройстве и сохраняет их в переданный список
|
||||
(если не нулевой).
|
||||
Возвращенные в списке записи должны быть очищены после использования
|
||||
с помощью X502_FreeDevRecordList() (также в случае повторного
|
||||
вызов L502_GetDevRecordsList() с тем же массивом записей, записи, полученные
|
||||
при предыдущем вызове, должны быть сперва очищены).
|
||||
|
||||
@param[in] list Массив для сохранения записей о найденных устройствах.
|
||||
Должен содержать место для сохранения не менее size записей.
|
||||
Может быть NULL, если size=0, а devcnt!=NULL, в случае,
|
||||
если нужно только получить количество модулей в системе.
|
||||
@param[in] size Определяет, сколько максимально записей может
|
||||
быть сохранено в массив list. Будут сохранены только
|
||||
первые size записей, если устройств найденно больше.
|
||||
@param[in] flags Флаги из #t_x502_getdevs_flags, определяющие поведение
|
||||
функции.
|
||||
@param[out] devcnt Если не нулевой указатель, то в данную переменную сохраняется
|
||||
общее число найденных модулей L-502 (может быть больше size).
|
||||
@return Если <0 --- код ошибки, иначе количество сохраненных
|
||||
записей о найденных устройствах (всегда <= size).
|
||||
Именно на этот размер нужно сделать в дальнейшем
|
||||
X502_FreeDevRecordList() для освобождения памяти,
|
||||
выделенной под информацию, на которую ссылается запись.
|
||||
******************************************************************************/
|
||||
X502_EXPORT(int32_t) L502_GetDevRecordsList(t_x502_devrec *list, uint32_t size,
|
||||
uint32_t flags, uint32_t *devcnt) ;
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
|
||||
/***************************************************************************//**
|
||||
@addtogroup func_misc
|
||||
@{
|
||||
*******************************************************************************/
|
||||
|
||||
/**************************************************************************//**
|
||||
@brief Получить версию драйвера модуля L-502
|
||||
|
||||
Функция возвращает версию драйвера, установленного для
|
||||
указанного открытого устройства.
|
||||
Версия возвращается в виде 32-битного числа.
|
||||
Строковое представление возвращенной версии - четыре числа,
|
||||
старшее соответствует старшему байту, младшее - младшему.
|
||||
|
||||
Старший байт - мажорная версия, второй по старшинству байт - минорная,
|
||||
третий - ревизия, четвертый - номер сборки (не используется - всегда 0).
|
||||
|
||||
Это та версия, которая отображается в диспетчере устройств в Windows или
|
||||
с помощью modinfo в Linux.
|
||||
|
||||
Данная функция доступна только для устройств с интерфейсом PCI/PCI-Express (L502)
|
||||
|
||||
@param[in] hnd Описатель модуля.
|
||||
@param[out] ver 32-битное число, представляющее собой версию драйвера
|
||||
@return Код ошибки.
|
||||
*****************************************************************************/
|
||||
X502_EXPORT(int32_t) L502_GetDriverVersion(t_x502_hnd hnd, uint32_t* ver);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
48
l502/l502api.rc.in
Normal file
48
l502/l502api.rc.in
Normal file
@ -0,0 +1,48 @@
|
||||
#include <winresrc.h>
|
||||
|
||||
#define LIB_VERSION @X502API_VER_MAJOR@,@X502API_VER_MINOR@,@X502API_VER_PATCH@,0
|
||||
#define VER_DEBUG VS_FF_DEBUG
|
||||
|
||||
|
||||
1 VERSIONINFO
|
||||
FILEVERSION LIB_VERSION
|
||||
PRODUCTVERSION LIB_VERSION
|
||||
#ifndef NDEBUG
|
||||
FILEFLAGS 0
|
||||
#else
|
||||
FILEFLAGS VER_DEBUG
|
||||
#endif
|
||||
FILEOS VOS_NT_WINDOWS32
|
||||
FILETYPE VFT_DLL
|
||||
FILESUBTYPE VFT2_UNKNOWN
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "04090000"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "L-Card"
|
||||
VALUE "FileDescription", "Library for L502"
|
||||
VALUE "FileVersion", "@X502API_VERSION@"
|
||||
VALUE "OriginalFilename", "l502api.dll"
|
||||
VALUE "ProductName", "l502api"
|
||||
VALUE "ProductVersion", "@X502API_VERSION@"
|
||||
VALUE "LegalCopyright", "© 2015 L-Card Ltd."
|
||||
END
|
||||
|
||||
BLOCK "04190000"
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Л Кард"
|
||||
VALUE "FileDescription", "Библиотека для работы с платой L502"
|
||||
VALUE "FileVersion", "@X502API_VERSION@"
|
||||
VALUE "OriginalFilename", "l502api.dll"
|
||||
VALUE "ProductName", "l502api"
|
||||
VALUE "ProductVersion", "@X502API_VERSION@"
|
||||
VALUE "LegalCopyright", "© 2015 ООО 'Л Кард'"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1252
|
||||
VALUE "Translation", 0x419, 1251
|
||||
END
|
||||
END
|
||||
272
l502/l502api_bf.c
Normal file
272
l502/l502api_bf.c
Normal file
@ -0,0 +1,272 @@
|
||||
#include "l502api_private.h"
|
||||
#include "ltimer.h"
|
||||
#include "l502_fpga_regs.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define BF_LDR_HDR_SIZE (16)
|
||||
#define BF_LDR_HDRSGN (0xAD)
|
||||
|
||||
#define BF_LDR_HDRPOS_SGN (3)
|
||||
|
||||
#define BF_LDR_FLAG_SAVE (0x0010) //не используется
|
||||
#define BF_LDR_FLAG_AUX (0x0020) //не используется
|
||||
#define BF_LDR_FLAG_FILL (0x0100)
|
||||
#define BF_LDR_FLAG_QUICKBOOT (0x0200) //не используется
|
||||
#define BF_LDR_FLAG_CALLBACK (0x0400) //не используется
|
||||
#define BF_LDR_FLAG_INIT (0x0800) //не используется
|
||||
#define BF_LDR_FLAG_IGNORE (0x1000)
|
||||
#define BF_LDR_FLAG_INDIRECT (0x2000) //не используется
|
||||
#define BF_LDR_FLAG_FIRST (0x4000)
|
||||
#define BF_LDR_FLAG_FINAL (0x8000)
|
||||
|
||||
#define L502_BF_WAIT_LOAD_RDY_TOUT 500
|
||||
|
||||
#define LDR_BUFF_SIZE 4096
|
||||
|
||||
#define BF_CHECK_ADDR(addr) (((addr) < 0xFFA0C000) && ((addr)>= 0xFFA0000)) || \
|
||||
(((addr) < 0xFF908000) && ((addr) >=0xFF900000)) || \
|
||||
(((addr) < 0xFF808000) && ((addr) >=0xFF800000)) || \
|
||||
(((addr) < 0x2000000)) ? 0 : X502_ERR_BF_INVALID_ADDR
|
||||
|
||||
#define BF_CHECK_ADDR_SIZE(addr, size) BF_CHECK_ADDR(addr) ? X502_ERR_BF_INVALID_ADDR : \
|
||||
BF_CHECK_ADDR(addr+size*4-1) ? X502_ERR_BF_INVALID_ADDR : 0
|
||||
|
||||
|
||||
typedef struct st_bf_ldr_pkt {
|
||||
uint8_t res;
|
||||
uint8_t dma_mode;
|
||||
uint16_t flags;
|
||||
uint32_t addr;
|
||||
uint32_t size;
|
||||
uint32_t arg;
|
||||
} t_bf_ldr_pkt;
|
||||
|
||||
/* Разбираем заголовок блока LDR-формата из буфера размером BF_LDR_HDR_SIZE
|
||||
и сохраняем параметры в структуре pkt */
|
||||
int32_t f_parse_ldr_hdr(const uint8_t *hdr, t_bf_ldr_pkt *pkt) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
uint32_t* pdw_buff = (uint32_t*)hdr;
|
||||
uint8_t xor_ch = 0;
|
||||
int i;
|
||||
for (i=0; i < BF_LDR_HDR_SIZE; i++) {
|
||||
xor_ch ^= hdr[i];
|
||||
}
|
||||
|
||||
if ((xor_ch!=0) || (hdr[BF_LDR_HDRPOS_SGN] != BF_LDR_HDRSGN)) {
|
||||
err = X502_ERR_LDR_FILE_FORMAT;
|
||||
} else {
|
||||
pkt->res = 0;
|
||||
pkt->dma_mode = pdw_buff[0]&0xF;
|
||||
pkt->flags = pdw_buff[0]&0xFFF0;
|
||||
pkt->addr = pdw_buff[1];
|
||||
pkt->size = pdw_buff[2];
|
||||
pkt->arg = pdw_buff[3];
|
||||
|
||||
if ((pkt->flags & BF_LDR_FLAG_INIT) && (pkt->flags & BF_LDR_FLAG_FILL)) {
|
||||
err = X502_ERR_LDR_FILE_FORMAT;
|
||||
} else if (pkt->flags & (BF_LDR_FLAG_CALLBACK | BF_LDR_FLAG_INDIRECT | BF_LDR_FLAG_INIT)) {
|
||||
err = X502_ERR_LDR_FILE_UNSUP_FEATURE;
|
||||
} else if ((pkt->flags & BF_LDR_FLAG_INIT) && (pkt->addr != 0xFFA00000)) {
|
||||
err = X502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int32_t f_bf_wait_cmd_done(t_x502_hnd hnd) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
t_ltimer tmr;
|
||||
uint32_t status;
|
||||
ltimer_set(&tmr, LTIMER_MS_TO_CLOCK_TICKS(X502_BF_REQ_TOUT));
|
||||
do {
|
||||
err = l502_port_fpga_reg_read(hnd, L502_REGS_BF_STATUS, &status);
|
||||
} while ((status & L502_REGBIT_BF_STATUS_BUSY_Msk) &&
|
||||
(err == X502_ERR_OK) && !ltimer_expired(&tmr));
|
||||
|
||||
if (!err && (status & L502_REGBIT_BF_STATUS_BUSY_Msk))
|
||||
err = X502_ERR_BF_REQ_TIMEOUT;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int32_t l502_iface_bf_mem_block_rd(t_x502_hnd hnd, uint32_t addr, uint32_t *block, uint32_t size){
|
||||
uint32_t i;
|
||||
int32_t err = f_bf_wait_cmd_done(hnd);
|
||||
/* записываем переметры передачи - размер и адрес в памяти BlackFin */
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_REQ_SIZE, size);
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_REQ_ADDR, addr);
|
||||
/* даем команду на запис */
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_CMD, L502_BF_CMD_READ);
|
||||
|
||||
/* ждем, пока операция не будет завершена */
|
||||
if (err == X502_ERR_OK)
|
||||
err = f_bf_wait_cmd_done(hnd);
|
||||
|
||||
/* записываем блок данных в буфер ПЛИС */
|
||||
for (i=0; (i < size) && (err == X502_ERR_OK); i++) {
|
||||
err = l502_port_fpga_reg_read(hnd, L502_REGS_BF_REQ_DATA+i, &block[i]);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_iface_bf_mem_block_wr(t_x502_hnd hnd, uint32_t addr, const uint32_t *block, uint32_t size) {
|
||||
uint32_t i;
|
||||
int32_t err = f_bf_wait_cmd_done(hnd);
|
||||
if (err == X502_ERR_OK) {
|
||||
/* записываем блок данных в буфер ПЛИС */
|
||||
for (i=0; (i < size) && (err == X502_ERR_OK); i++) {
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_REQ_DATA+i, block[i]);
|
||||
}
|
||||
|
||||
/* записываем переметры передачи - размер и адрес в памяти BlackFin */
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_REQ_SIZE, size);
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_REQ_ADDR, addr);
|
||||
/* даем команду на запис */
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_CMD, L502_BF_CMD_WRITE);
|
||||
|
||||
/* ждем, пока операция не будет завершена */
|
||||
if (err == X502_ERR_OK)
|
||||
err = f_bf_wait_cmd_done(hnd);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int32_t f_bf_mem_wr(t_x502_hnd hnd, uint32_t addr, const uint32_t* regs, uint32_t size) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
|
||||
/* данные записываем блоками по L502_BF_REQ_DATA_SIZE */
|
||||
while ((err == X502_ERR_OK) && size) {
|
||||
int put_size = (size < hnd->iface_hnd->bf_mem_block_size) ? size :
|
||||
hnd->iface_hnd->bf_mem_block_size;
|
||||
err = hnd->iface_hnd->bf_mem_block_wr(hnd, addr, regs, put_size);
|
||||
if (!err) {
|
||||
size -= put_size;
|
||||
regs += put_size;
|
||||
addr += put_size*4;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_iface_bf_firm_load(t_x502_hnd hnd, const char *filename) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
FILE* ldr_file=fopen(filename, "rb");
|
||||
if (ldr_file==NULL) {
|
||||
err = X502_ERR_LDR_FILE_OPEN;
|
||||
} else {
|
||||
int32_t next_err = X502_ERR_OK;
|
||||
uint32_t *ldr_buff = NULL;
|
||||
ldr_buff = malloc(LDR_BUFF_SIZE);
|
||||
if (ldr_buff == NULL)
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
int rd_size = 0;
|
||||
int stop = 0;
|
||||
uint32_t reg;
|
||||
uint8_t hdr[BF_LDR_HDR_SIZE];
|
||||
t_ltimer tmr;
|
||||
|
||||
//uint32_t* pdw = (uint32_t*)ldr_buff;
|
||||
t_bf_ldr_pkt pkt, pkt_next;
|
||||
uint32_t bf_val = 0;
|
||||
memset(&pkt_next, 0, sizeof(pkt_next));
|
||||
|
||||
l502_port_fpga_reg_read(hnd, L502_REGS_BF_CTL, &bf_val);
|
||||
l502_port_fpga_reg_write(hnd, L502_REGS_BF_CTL, L502_REGBIT_BF_CTL_DSP_MODE_Msk
|
||||
| (bf_val & 0xF00)); //set rst
|
||||
SLEEP_MS(1);
|
||||
l502_port_fpga_reg_write(hnd, L502_REGS_BF_CTL, L502_REGBIT_BF_CTL_DSP_MODE_Msk |
|
||||
L502_REGBIT_BF_CTL_BF_RESET_Msk | (bf_val & 0xF00)); //release rst
|
||||
|
||||
ltimer_set(&tmr, LTIMER_MS_TO_CLOCK_TICKS(L502_BF_WAIT_LOAD_RDY_TOUT));
|
||||
do {
|
||||
l502_port_fpga_reg_read(hnd, L502_REGS_BF_CTL, ®);
|
||||
if ((reg & L502_REGBIT_BF_CTL_HOST_WAIT_Msk) && ltimer_expired(&tmr))
|
||||
err = X502_ERR_BF_LOAD_RDY_TOUT;
|
||||
} while ((err == X502_ERR_OK) && (reg & L502_REGBIT_BF_CTL_HOST_WAIT_Msk));
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
err = fread(hdr, 1, BF_LDR_HDR_SIZE, ldr_file) == BF_LDR_HDR_SIZE ?
|
||||
f_parse_ldr_hdr(hdr, &pkt) : X502_ERR_LDR_FILE_READ;
|
||||
}
|
||||
|
||||
while ((err == X502_ERR_OK) && !stop) {
|
||||
if (next_err != X502_ERR_OK) {
|
||||
err = next_err;
|
||||
} else if (((pkt.flags & BF_LDR_FLAG_FILL) == 0) && (pkt.size != 0)) {
|
||||
int r_size = (pkt.size > LDR_BUFF_SIZE) ? LDR_BUFF_SIZE : pkt.size;
|
||||
|
||||
rd_size = (int)fread(ldr_buff, 1, r_size, ldr_file);
|
||||
if (rd_size!=r_size)
|
||||
err = X502_ERR_LDR_FILE_READ;
|
||||
}
|
||||
if (err == X502_ERR_OK) {
|
||||
if (pkt.size > LDR_BUFF_SIZE) {
|
||||
pkt_next = pkt;
|
||||
pkt_next.addr += LDR_BUFF_SIZE;
|
||||
pkt_next.size -= LDR_BUFF_SIZE;
|
||||
pkt.size = LDR_BUFF_SIZE;
|
||||
} else {
|
||||
next_err = fread(hdr, 1, BF_LDR_HDR_SIZE, ldr_file) == BF_LDR_HDR_SIZE ?
|
||||
f_parse_ldr_hdr(hdr, &pkt_next) : X502_ERR_LDR_FILE_READ;
|
||||
if (next_err != X502_ERR_OK) {
|
||||
pkt_next.size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (pkt.size!=0) {
|
||||
uint32_t size = ((pkt.size+31)/(32))*8;
|
||||
if (pkt.flags & BF_LDR_FLAG_FILL) {
|
||||
uint32_t i;
|
||||
for (i=0; i < size; i++)
|
||||
ldr_buff[i] = pkt.arg;
|
||||
}
|
||||
|
||||
if ((pkt.flags & BF_LDR_FLAG_FINAL)
|
||||
|| ((pkt_next.flags & BF_LDR_FLAG_FINAL) && (pkt_next.size==0))) {
|
||||
uint32_t buf_pos = 0;
|
||||
err = BF_CHECK_ADDR_SIZE(pkt.addr, size);
|
||||
|
||||
if ((err == X502_ERR_OK) && (size > 8)) {
|
||||
err = f_bf_mem_wr(hnd, pkt.addr, ldr_buff, size-8);
|
||||
pkt.addr+=4*(size-8);
|
||||
buf_pos = size-8;
|
||||
size = 8;
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_CMD, L502_BF_CMD_HIRQ);
|
||||
if (err == X502_ERR_OK)
|
||||
err = f_bf_mem_wr(hnd, pkt.addr, &ldr_buff[buf_pos], size);
|
||||
stop=1;
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_BF_CTL, L502_REGBIT_BF_CTL_DSP_MODE_Msk |
|
||||
L502_REGBIT_BF_CTL_BF_RESET_Msk);
|
||||
}
|
||||
} else if (!(pkt.flags & BF_LDR_FLAG_IGNORE)) {
|
||||
err = BF_CHECK_ADDR_SIZE(pkt.addr, size);
|
||||
if (!err)
|
||||
err = f_bf_mem_wr(hnd, pkt.addr, ldr_buff, size);
|
||||
}
|
||||
}
|
||||
pkt = pkt_next;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(ldr_buff);
|
||||
|
||||
fclose(ldr_file);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
285
l502/l502api_compat.c
Normal file
285
l502/l502api_compat.c
Normal file
@ -0,0 +1,285 @@
|
||||
#include "l502api_compat.h"
|
||||
#include "x502api_private.h"
|
||||
|
||||
LPCIE_EXPORT(t_l502_hnd) L502_Create(void) {
|
||||
return X502_Create();
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_Free(t_l502_hnd hnd) {
|
||||
return X502_Free(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_Close(t_l502_hnd hnd) {
|
||||
return X502_Close(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetDevInfo(t_l502_hnd hnd, t_l502_info* info) {
|
||||
return X502_GetDevInfo(hnd, (t_x502_info*)info);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_Configure(t_l502_hnd hnd, uint32_t flags) {
|
||||
return X502_Configure(hnd, flags);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetLChannel(t_l502_hnd hnd, uint32_t lch, uint32_t phy_ch,
|
||||
uint32_t mode, uint32_t range, uint32_t avg) {
|
||||
return X502_SetLChannel(hnd, lch, phy_ch, mode, range, avg);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetLChannelCount(t_l502_hnd hnd, uint32_t lch_cnt) {
|
||||
return X502_SetLChannelCount(hnd, lch_cnt);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetLChannelCount(t_l502_hnd hnd, uint32_t* lch_cnt) {
|
||||
return X502_GetLChannelCount(hnd, lch_cnt);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetAdcFreqDivider(t_l502_hnd hnd, uint32_t adc_freq_div) {
|
||||
return X502_SetAdcFreqDivider(hnd, adc_freq_div);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetAdcInterframeDelay(t_l502_hnd hnd, uint32_t delay) {
|
||||
return X502_SetAdcInterframeDelay(hnd, delay);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetDinFreqDivider(t_l502_hnd hnd, uint32_t din_freq_div) {
|
||||
return X502_SetDinFreqDivider(hnd, din_freq_div);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetAdcFreq(t_l502_hnd hnd, double *f_acq, double *f_frame) {
|
||||
return X502_SetAdcFreq(hnd, f_acq, f_frame);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetDinFreq(t_l502_hnd hnd, double *f_din) {
|
||||
return X502_SetDinFreq(hnd, f_din);
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetAdcFreq(t_l502_hnd hnd, double *f_acq, double *f_frame) {
|
||||
return X502_GetAdcFreq(hnd, f_acq, f_frame);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetRefFreq(t_l502_hnd hnd, uint32_t freq) {
|
||||
return X502_SetRefFreq(hnd, freq);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetSyncMode(t_l502_hnd hnd, uint32_t sync_mode) {
|
||||
return X502_SetSyncMode(hnd, sync_mode);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetSyncStartMode(t_l502_hnd hnd, uint32_t sync_start_mode) {
|
||||
return X502_SetSyncStartMode(hnd, sync_start_mode);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetMode(t_l502_hnd hnd, uint32_t mode) {
|
||||
return X502_SetMode(hnd, mode);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetMode(t_l502_hnd hnd, uint32_t* mode) {
|
||||
return X502_GetMode(hnd, mode);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetAdcCoef(t_l502_hnd hnd, uint32_t range, double k, double offs) {
|
||||
return X502_SetAdcCoef(hnd, range, k, offs);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetAdcCoef(t_l502_hnd hnd, uint32_t range, double* k, double* offs) {
|
||||
return X502_GetAdcCoef(hnd, range, k, offs);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetDacCoef(t_l502_hnd hnd, uint32_t ch, double k, double offs) {
|
||||
return X502_SetDacCoef(hnd, ch, k, offs);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetDacCoef(t_l502_hnd hnd, uint32_t ch, double* k, double* offs) {
|
||||
return X502_GetDacCoef(hnd, ch, k, offs);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_AsyncOutDac(t_l502_hnd hnd, uint32_t ch, double data, uint32_t flags) {
|
||||
return X502_AsyncOutDac(hnd, ch, data, flags);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_AsyncOutDig(t_l502_hnd hnd, uint32_t val, uint32_t msk) {
|
||||
return X502_AsyncOutDig(hnd, val, msk);
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_AsyncInDig(t_l502_hnd hnd, uint32_t* din) {
|
||||
return X502_AsyncInDig(hnd, din);
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_AsyncGetAdcFrame(t_l502_hnd hnd, uint32_t flags,
|
||||
uint32_t tout, double* data) {
|
||||
return X502_AsyncGetAdcFrame(hnd, flags, tout, data);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_StreamsEnable(t_l502_hnd hnd, uint32_t streams) {
|
||||
return X502_StreamsEnable(hnd, streams);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_StreamsDisable(t_l502_hnd hnd, uint32_t streams) {
|
||||
return X502_StreamsDisable(hnd, streams);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_StreamsStart(t_l502_hnd hnd) {
|
||||
return X502_StreamsStart(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_StreamsStop(t_l502_hnd hnd) {
|
||||
return X502_StreamsStop(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_IsRunning(t_l502_hnd hnd) {
|
||||
return X502_IsRunning(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_Recv(t_l502_hnd hnd, uint32_t* buf, uint32_t size, uint32_t tout) {
|
||||
return X502_Recv(hnd, buf, size, tout);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_Send(t_l502_hnd hnd, const uint32_t* buf, uint32_t size, uint32_t tout) {
|
||||
return X502_Send(hnd, buf, size, tout);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_ProcessAdcData(t_l502_hnd hnd, const uint32_t* src, double *dest,
|
||||
uint32_t *size, uint32_t flags) {
|
||||
return X502_ProcessAdcData(hnd, src, dest, size, flags);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_ProcessData(t_l502_hnd hnd, const uint32_t* src, uint32_t size,
|
||||
uint32_t flags, double *adc_data, uint32_t *adc_data_size,
|
||||
uint32_t *din_data, uint32_t *din_data_size) {
|
||||
return X502_ProcessData(hnd, src, size, flags, adc_data, adc_data_size,
|
||||
din_data, din_data_size);
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_ProcessDataWithUserExt(t_l502_hnd hnd, const uint32_t* src, uint32_t size,
|
||||
uint32_t flags, double *adc_data,
|
||||
uint32_t *adc_data_size, uint32_t *din_data,
|
||||
uint32_t *din_data_size,
|
||||
uint32_t *usr_data, uint32_t *usr_data_size) {
|
||||
return X502_ProcessDataWithUserExt(hnd, src, size, flags, adc_data, adc_data_size,
|
||||
din_data, din_data_size, usr_data, usr_data_size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_PrepareData(t_l502_hnd hnd, const double* dac1, const double* dac2,
|
||||
const uint32_t* digout, uint32_t size, int32_t flags,
|
||||
uint32_t* out_buf) {
|
||||
return X502_PrepareData(hnd, dac1, dac2, digout, size, flags, out_buf);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetRecvReadyCount(t_l502_hnd hnd, uint32_t *rdy_cnt) {
|
||||
return X502_GetRecvReadyCount(hnd, rdy_cnt);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetSendReadyCount(t_l502_hnd hnd, uint32_t *rdy_cnt) {
|
||||
return X502_GetSendReadyCount(hnd, rdy_cnt);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_GetNextExpectedLchNum(t_l502_hnd hnd, uint32_t *lch) {
|
||||
return X502_GetNextExpectedLchNum(hnd, lch);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_PreloadStart(t_l502_hnd hnd) {
|
||||
return X502_PreloadStart(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_OutCycleLoadStart(t_l502_hnd hnd, uint32_t size) {
|
||||
return X502_OutCycleLoadStart(hnd, size);
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_OutCycleSetup(t_l502_hnd hnd, uint32_t flags) {
|
||||
return X502_OutCycleSetup(hnd, flags);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_OutCycleStop(t_l502_hnd hnd, uint32_t flags) {
|
||||
return X502_OutCycleStop(hnd, flags);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetDmaBufSize(t_l502_hnd hnd, uint32_t dma_ch, uint32_t size) {
|
||||
return X502_SetStreamBufSize(hnd, dma_ch, size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetDmaIrqStep(t_l502_hnd hnd, uint32_t dma_ch, uint32_t step) {
|
||||
return X502_SetStreamStep(hnd, dma_ch, step);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_BfLoadFirmware(t_l502_hnd hnd, const char* filename) {
|
||||
return X502_BfLoadFirmware(hnd, filename);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_BfCheckFirmwareIsLoaded(t_l502_hnd hnd, uint32_t *version) {
|
||||
return X502_BfCheckFirmwareIsLoaded(hnd, version);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_BfMemRead(t_l502_hnd hnd, uint32_t addr, uint32_t* regs,
|
||||
uint32_t size) {
|
||||
return X502_BfMemRead(hnd, addr, regs, size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_BfMemWrite(t_l502_hnd hnd, uint32_t addr,
|
||||
const uint32_t* regs, uint32_t size) {
|
||||
return X502_BfMemWrite(hnd, addr, regs, size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_BfExecCmd(t_l502_hnd hnd, uint16_t cmd_code, uint32_t par,
|
||||
const uint32_t* snd_data, uint32_t snd_size,
|
||||
uint32_t* rcv_data, uint32_t rcv_size, uint32_t tout, uint32_t* recvd_size) {
|
||||
return X502_BfExecCmd(hnd, cmd_code, par, snd_data, snd_size, rcv_data, rcv_size,
|
||||
tout, recvd_size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FlashRead(t_l502_hnd hnd, uint32_t addr, uint8_t* data,
|
||||
uint32_t size) {
|
||||
return X502_FlashRead(hnd, addr, data, size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FlashWrite(t_l502_hnd hnd, uint32_t addr,
|
||||
const uint8_t* data, uint32_t size) {
|
||||
return X502_FlashWrite(hnd, addr, data, size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FlashErase(t_l502_hnd hnd, uint32_t addr, uint32_t size) {
|
||||
return X502_FlashErase(hnd, addr, size);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FlashWriteEnable(t_l502_hnd hnd) {
|
||||
return X502_FlashWriteEnable(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FlashWriteDisable(t_l502_hnd hnd) {
|
||||
return X502_FlashWriteDisable(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(uint32_t) L502_GetDllVersion(void) {
|
||||
return X502_GetLibraryVersion();
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(const char*) L502_GetErrorString(int32_t err) {
|
||||
return X502_GetErrorString(err);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_LedBlink(t_l502_hnd hnd) {
|
||||
return X502_LedBlink(hnd);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_SetDigInPullup(t_l502_hnd hnd, uint32_t pullups) {
|
||||
return X502_SetDigInPullup(hnd, pullups);
|
||||
}
|
||||
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FpgaRegWrite(t_l502_hnd hnd, uint32_t reg, uint32_t val) {
|
||||
return X502_FpgaRegWrite(hnd, reg, val);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_FpgaRegRead(t_l502_hnd hnd, uint32_t reg, uint32_t *val) {
|
||||
return X502_FpgaRegRead(hnd, reg, val);
|
||||
}
|
||||
|
||||
LPCIE_EXPORT(int32_t) L502_ReloadDevInfo(t_l502_hnd hnd) {
|
||||
return X502_ReloadDevInfo(hnd, 0);
|
||||
}
|
||||
1834
l502/l502api_compat.h
Normal file
1834
l502/l502api_compat.h
Normal file
File diff suppressed because it is too large
Load Diff
171
l502/l502api_eeprom.c
Normal file
171
l502/l502api_eeprom.c
Normal file
@ -0,0 +1,171 @@
|
||||
#include "l502api_private.h"
|
||||
#include "ltimer.h"
|
||||
#include "l502_fpga_regs.h"
|
||||
|
||||
#define L502_EEPROM_BIG_SECTOR_SIZE (64*1024)
|
||||
#define L502_EEPROM_SMALL_SECTOR_SIZE (4*1024)
|
||||
|
||||
#define L502_FLASH_WRITE_TOUT 500
|
||||
#define L502_FLASH_ERASE_TOUT 500
|
||||
|
||||
/** биты регистра статуса */
|
||||
typedef enum {
|
||||
SST25_STATUS_BUSY = 0x01,
|
||||
SST25_STATUS_WEL = 0x02,
|
||||
SST25_STATUS_BP0 = 0x04,
|
||||
SST25_STATUS_BP1 = 0x08,
|
||||
SST25_STATUS_BP2 = 0x10,
|
||||
SST25_STATUS_BP3 = 0x20,
|
||||
SST25_STATUS_AAI = 0x40,
|
||||
SST25_STATUS_BPL = 0x80
|
||||
} t_sst25_status_bits;
|
||||
|
||||
static uint8_t f_prot_bits[] = {
|
||||
SST25_STATUS_BP2 | SST25_STATUS_BP1 | SST25_STATUS_BP0,
|
||||
SST25_STATUS_BP2 | SST25_STATUS_BP0,
|
||||
SST25_STATUS_BP2,
|
||||
SST25_STATUS_BP0,
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
|
||||
static LINLINE int32_t f_eeprom_rd_status(t_x502_hnd hnd, uint8_t* stat) {
|
||||
uint32_t val;
|
||||
int32_t err = l502_port_fpga_reg_read(hnd, L502_REGS_EEPROM_RD_STATUS, &val);
|
||||
if (err == X502_ERR_OK)
|
||||
*stat = (val>>24)&0xFF;
|
||||
return err;
|
||||
}
|
||||
|
||||
static LINLINE int32_t f_eeprom_wr_status(t_x502_hnd hnd, uint8_t stat) {
|
||||
int32_t err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_STATUS_EN, 1);
|
||||
if (err == X502_ERR_OK) {
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_STATUS, stat);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static int32_t f_eeprom_wr_byte(t_x502_hnd hnd, uint32_t addr, uint8_t val) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
t_ltimer tmr;
|
||||
uint8_t stat = SST25_STATUS_BUSY;
|
||||
|
||||
/* разрешаем запись в EEPROM */
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_EN, 1);
|
||||
if (err == X502_ERR_OK) {
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_BYTE, ((addr & 0xFFFFFF) << 8) | val);
|
||||
if (err != X502_ERR_OK)
|
||||
l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_DIS, 1);
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK)
|
||||
ltimer_set(&tmr, LTIMER_MS_TO_CLOCK_TICKS(L502_FLASH_WRITE_TOUT));
|
||||
|
||||
/* Ожидаем завершения записи */
|
||||
while ((err == X502_ERR_OK) && (stat & SST25_STATUS_BUSY) && !ltimer_expired(&tmr)) {
|
||||
err = f_eeprom_rd_status(hnd, &stat);
|
||||
}
|
||||
|
||||
if ((err == X502_ERR_OK) && (stat & SST25_STATUS_BUSY)) {
|
||||
err = X502_ERR_FLASH_WRITE_TOUT;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int32_t l502_iface_flash_rd(t_x502_hnd hnd, uint32_t addr, uint8_t* data, uint32_t size) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
uint32_t val;
|
||||
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_SET_RD_ADDR, (addr & 0xFFFFFF) << 8);
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_read(hnd, L502_REGS_EEPROM_RD_DWORD, &val);
|
||||
if (err == X502_ERR_OK) {
|
||||
unsigned int i;
|
||||
for (i=0; (i < sizeof(val)) && size; i++, size--) {
|
||||
*data++ = val & 0xFF;
|
||||
val >>= 8;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_iface_flash_wr(t_x502_hnd hnd, uint32_t addr, const uint8_t* data, uint32_t size) {
|
||||
uint32_t i;
|
||||
int32_t err = X502_ERR_OK;
|
||||
for (i=0; (i < size) && (err == X502_ERR_OK); i++) {
|
||||
err = f_eeprom_wr_byte(hnd, addr+i, data[i]);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_iface_flash_erase(t_x502_hnd hnd, uint32_t addr, uint32_t size) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
if (((addr & (L502_EEPROM_SMALL_SECTOR_SIZE-1)) ||
|
||||
(size & (L502_EEPROM_SMALL_SECTOR_SIZE-1)))) {
|
||||
err = X502_ERR_FLASH_SECTOR_BOUNDARY;
|
||||
}
|
||||
|
||||
while((size != 0) && (err == X502_ERR_OK)) {
|
||||
uint32_t er_size;
|
||||
/* разрешаем запись в EEPROM */
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_EN, 1);
|
||||
if (err == X502_ERR_OK) {
|
||||
uint8_t stat = SST25_STATUS_BUSY;
|
||||
t_ltimer tmr;
|
||||
/* проверяем - можем ли стереть целиком большой сектор или
|
||||
придется писать в мелкий */
|
||||
if ((size >= L502_EEPROM_BIG_SECTOR_SIZE) &&
|
||||
!(size & (L502_EEPROM_BIG_SECTOR_SIZE-1))) {
|
||||
er_size = L502_EEPROM_BIG_SECTOR_SIZE;
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_ERASE_64K, addr<<8);
|
||||
} else {
|
||||
er_size = L502_EEPROM_SMALL_SECTOR_SIZE;
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_ERASE_4K, addr<<8);
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK)
|
||||
ltimer_set(&tmr, LTIMER_MS_TO_CLOCK_TICKS(L502_FLASH_ERASE_TOUT));
|
||||
|
||||
/* ожидаем завершения стирания */
|
||||
while ((err == X502_ERR_OK) && (stat & SST25_STATUS_BUSY) && !ltimer_expired(&tmr)) {
|
||||
err = f_eeprom_rd_status(hnd, &stat);
|
||||
}
|
||||
|
||||
if ((err == X502_ERR_OK) && (stat & SST25_STATUS_BUSY)) {
|
||||
err = X502_ERR_FLASH_ERASE_TOUT;
|
||||
}
|
||||
|
||||
/* запрещаем запись, если произошла ошибка. при успешном стирании
|
||||
запись будут запрещена атоматически */
|
||||
if (err != X502_ERR_OK)
|
||||
l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_EN, 0);
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
addr += er_size;
|
||||
size -= er_size;
|
||||
}
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_iface_flash_set_prot(t_x502_hnd hnd, uint32_t prot, const uint8_t* prot_data, uint32_t size) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
uint16_t prot_code = 0;
|
||||
if (size == 2) {
|
||||
prot_code = ((uint16_t)prot_data[1] << 8) | prot_data[0];
|
||||
}
|
||||
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_STATUS_EN, 1);
|
||||
if ((err == X502_ERR_OK) && (prot_code != 0))
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_HARD_WR_STATUS_EN, prot_code);
|
||||
if (err == X502_ERR_OK)
|
||||
err = l502_port_fpga_reg_write(hnd, L502_REGS_EEPROM_WR_STATUS, f_prot_bits[prot]);
|
||||
return err;
|
||||
}
|
||||
54
l502/l502api_private.h
Normal file
54
l502/l502api_private.h
Normal file
@ -0,0 +1,54 @@
|
||||
#ifndef L502API_PRIVATE_H
|
||||
#define L502API_PRIVATE_H
|
||||
|
||||
#include "x502api_private.h"
|
||||
#include "lpcie_ioctls.h"
|
||||
|
||||
#define L502_DEVICE_NAME "L502"
|
||||
|
||||
|
||||
typedef struct {
|
||||
#ifdef _WIN32
|
||||
HANDLE file;
|
||||
#else
|
||||
int file;
|
||||
#endif
|
||||
} t_pci_iface_data;
|
||||
|
||||
#define L502_PCI_IFACE_FILE(hnd) (((t_pci_iface_data*)hnd->iface_data)->file)
|
||||
|
||||
int32_t l502_port_fpga_reg_write(t_x502_hnd hnd, uint32_t reg, uint32_t val);
|
||||
int32_t l502_port_fpga_reg_read(t_x502_hnd hnd, uint32_t reg, uint32_t *val);
|
||||
int32_t l502_port_open(t_x502_hnd hnd, const t_x502_devrec *devrec);
|
||||
int32_t l502_port_free_iface_data(void *intptr);
|
||||
int32_t l502_port_close(t_x502_hnd hnd);
|
||||
int32_t l502_port_stream_start(t_x502_hnd hnd, uint32_t ch, uint32_t single);
|
||||
int32_t l502_port_stream_stop(t_x502_hnd hnd, uint32_t ch, uint32_t flags);
|
||||
int32_t l502_port_stream_free(t_x502_hnd hnd, uint32_t ch, uint32_t flags);
|
||||
int32_t l502_port_stream_read(t_x502_hnd hnd, uint32_t *buff, uint32_t size, uint32_t timeout);
|
||||
int32_t l502_port_stream_write(t_x502_hnd hnd, const uint32_t *buff, uint32_t size,
|
||||
uint32_t timeout);
|
||||
int32_t l502_port_stream_set_params(t_x502_hnd hnd, t_lpcie_stream_ch_params *par);
|
||||
int32_t l502_port_stream_rdy_size(t_x502_hnd hnd, uint32_t ch, uint32_t *rdy_size);
|
||||
int32_t l502_port_renew_info(t_x502_hnd hnd);
|
||||
int32_t l502_port_get_drv_ver(t_x502_hnd hnd, uint32_t *ver);
|
||||
int32_t l502_port_cycle_load_start(t_x502_hnd hnd, uint32_t ch, uint32_t size, uint32_t min_irq_step);
|
||||
int32_t l502_port_cycle_setup(t_x502_hnd hnd, uint32_t ch, uint32_t evt);
|
||||
int32_t l502_port_cycle_stop(t_x502_hnd hnd, uint32_t ch, uint32_t evt);
|
||||
int32_t l502_port_cycle_check_setup(t_x502_hnd hnd, uint32_t ch, uint32_t *done);
|
||||
|
||||
|
||||
|
||||
int32_t l502_iface_flash_rd(t_x502_hnd hnd, uint32_t addr, uint8_t* data, uint32_t size);
|
||||
int32_t l502_iface_flash_wr(t_x502_hnd hnd, uint32_t addr, const uint8_t* data, uint32_t size);
|
||||
int32_t l502_iface_flash_erase(t_x502_hnd hnd, uint32_t addr, uint32_t size);
|
||||
int32_t l502_iface_flash_set_prot(t_x502_hnd hnd, uint32_t prot, const uint8_t* prot_data, uint32_t size);
|
||||
|
||||
int32_t l502_iface_bf_mem_block_rd(t_x502_hnd hnd, uint32_t addr, uint32_t *block, uint32_t size);
|
||||
int32_t l502_iface_bf_mem_block_wr(t_x502_hnd hnd, uint32_t addr, const uint32_t *block, uint32_t size);
|
||||
int32_t l502_iface_bf_firm_load(t_x502_hnd hnd, const char *filename);
|
||||
|
||||
int32_t l502_devlist_gen(t_x502_devrec *info, void *iface_data);
|
||||
|
||||
#endif // L502API_PRIVATE_H
|
||||
|
||||
78
l502/linux/l502_ioctls.h
Normal file
78
l502/linux/l502_ioctls.h
Normal file
@ -0,0 +1,78 @@
|
||||
#ifndef LPCIE_IOCTLS_H
|
||||
#define LPCIE_IOCTLS_H
|
||||
|
||||
#include "linux/ioctl.h"
|
||||
#include "linux/types.h"
|
||||
|
||||
|
||||
#define L502_BF_IO_SIZE 8
|
||||
|
||||
#define LPCIE_DEVNAME_SIZE 32
|
||||
#define LPCIE_SERIAL_SIZE 32
|
||||
#define LPCIE_SOFTVER_SIZE 32
|
||||
#define LPCIE_REVISION_SIZE 16
|
||||
#define LPCIE_MODIFICATION_SIZE 16
|
||||
#define LPCIE_SPECINFO_SIZE 64
|
||||
|
||||
/** Информация о модуле */
|
||||
typedef struct
|
||||
{
|
||||
char Name[LPCIE_DEVNAME_SIZE]; /**< название модуля ("L-502") */
|
||||
char Serial[LPCIE_SERIAL_SIZE]; /**< серийный номер изделия */
|
||||
char SoftVer[LPCIE_SOFTVER_SIZE]; /**< версия ПО контроллера */
|
||||
char Revision[LPCIE_REVISION_SIZE]; /**< ревизия платы */
|
||||
char Modification[LPCIE_MODIFICATION_SIZE]; /**< опции */
|
||||
char SpecInfo[LPCIE_SPECINFO_SIZE]; /**< резервная информация */
|
||||
} t_lpcie_devinfo;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 addr;
|
||||
__u32 val;
|
||||
} t_lpcie_mem_rw;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
__u32 page_size; /** размер каждой страницы */
|
||||
__u32 irq_step; /** количество отсчетов, после которого генерится прерывание */
|
||||
__u16 pages_cnt; /** количество страниц */
|
||||
__u16 packet_size; /** размер пакета по PCI-Express */
|
||||
} t_lpcie_dma_params;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t addr;
|
||||
uint32_t reserv;
|
||||
uint32_t buf[L502_BF_IO_SIZE];
|
||||
} t_l502_bf_rw;
|
||||
|
||||
#define LPCIE_IO_MAGIC 'L'
|
||||
|
||||
#define LPCIE_IOCTL_GET_DEVINFO _IOR(LPCIE_IO_MAGIC, 0x80, t_lpcie_devinfo)
|
||||
#define LPCIE_IOCTL_TIMER_START _IOW(LPCIE_IO_MAGIC, 0x81, __u32)
|
||||
#define LPCIE_IOCTL_TIMER_STOP _IO(LPCIE_IO_MAGIC, 0x82)
|
||||
#define LPCIE_IOCTL_READ_CFG _IOWR(LPCIE_IO_MAGIC, 0x83, __u32)
|
||||
#define LPCIE_IOCTL_MEM_FPGA_RD _IOWR(LPCIE_IO_MAGIC, 0x86, t_lpcie_mem_rw)
|
||||
#define LPCIE_IOCTL_MEM_FPGA_WR _IOW(LPCIE_IO_MAGIC, 0x87, t_lpcie_mem_rw)
|
||||
#define LPCIE_IOCTL_MEM_BLOCK_RD _IOWR(LPCIE_IO_MAGIC, 0x86, t_lpcie_mem_rw)
|
||||
|
||||
#define LPCIE_IOCTL_ADC_START _IO(LPCIE_IO_MAGIC, 0x90)
|
||||
#define LPCIE_IOCTL_ADC_STOP _IO(LPCIE_IO_MAGIC, 0x91)
|
||||
#define LPCIE_IOCTL_DAC_START _IO(LPCIE_IO_MAGIC, 0x92)
|
||||
#define LPCIE_IOCTL_DAC_STOP _IO(LPCIE_IO_MAGIC, 0x93)
|
||||
#define LPCIE_IOCTL_SET_ADC_DMA_PAR _IOW(LPCIE_IO_MAGIC, 0x94, t_lpcie_dma_params)
|
||||
#define LPCIE_IOCTL_SET_DAC_DMA_PAR _IOW(LPCIE_IO_MAGIC, 0x95, t_lpcie_dma_params)
|
||||
#define LPCIE_IOCTL_DAC_RST_BUFS _IO(LPCIE_IO_MAGIC, 0x96)
|
||||
|
||||
#define LPCIE_IOCTL_ADC_GET_RDY _IOR(LPCIE_IO_MAGIC, 0x97, __u32)
|
||||
#define LPCIE_IOCTL_DAC_GET_FREE _IOR(LPCIE_IO_MAGIC, 0x98, __u32)
|
||||
|
||||
#define LPCIE_IOCTL_DAC_SET_CYCLE_BUF _IOW(LPCIE_IO_MAGIC, 0x99, __u32)
|
||||
#define LPCIE_IOCTL_DAC_SET_CYCLE_DATA _IOW(LPCIE_IO_MAGIC, 0x9A, __u32)
|
||||
|
||||
|
||||
#define LPCIE_IOCTL_BF_RD _IOR(LPCIE_IO_MAGIC, 0xA0, t_l502_bf_rw)
|
||||
#define LPCIE_IOCTL_BF_WR _IOW(LPCIE_IO_MAGIC, 0xA0, t_l502_bf_rw)
|
||||
#define LPCIE_IOCTL_BF_HOST_IRQ _IO(LPCIE_IO_MAGIC, 0xA1)
|
||||
|
||||
#endif // LPCIE_IOCTLS_H
|
||||
369
l502/linux/l502_spec.c
Normal file
369
l502/linux/l502_spec.c
Normal file
@ -0,0 +1,369 @@
|
||||
#include "../l502api_private.h"
|
||||
#include "../lpcie_ioctls.h"
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
#include <stdlib.h>
|
||||
#include <dirent.h>
|
||||
#include <libgen.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
#define LPCIE_CLASS_DIR "/sys/class/lpcie"
|
||||
|
||||
|
||||
static int32_t f_ioctl(int fd, unsigned long int req, void* val) {
|
||||
return ioctl(fd, req, val) ? X502_ERR_IOCTL_FAILD : X502_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int32_t l502_port_fpga_reg_write(t_x502_hnd hnd, uint32_t reg, uint32_t val) {
|
||||
t_lpcie_mem_rw mem_wr = {reg,val};
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_MEMFPGA_WR, &mem_wr);
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_fpga_reg_read(t_x502_hnd hnd, uint32_t reg, uint32_t *val) {
|
||||
t_lpcie_mem_rw mem_wr = {reg,0};
|
||||
int32_t err = f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_MEMFPGA_RD, &mem_wr);
|
||||
if ((err == X502_ERR_OK) && (val != NULL))
|
||||
*val = mem_wr.val;
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_set_params(t_x502_hnd hnd, t_lpcie_stream_ch_params *par) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_SET_PARAMS, par);
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_start(t_x502_hnd hnd, uint32_t ch, uint32_t single) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), single ? LPCIE_IOCTL_STREAM_START_SINGLE :
|
||||
LPCIE_IOCTL_STREAM_START, &ch);
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_stop(t_x502_hnd hnd, uint32_t ch, uint32_t flags) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_STOP, &ch);
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_free(t_x502_hnd hnd, uint32_t ch, uint32_t flags) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_FREE, &ch);
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_stream_rdy_size(t_x502_hnd hnd, uint32_t ch, uint32_t *rdy_size) {
|
||||
t_lpcie_get_rdy_par rdy_par = {ch,0};
|
||||
int32_t err = f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_GET_RDY_SIZE, &rdy_par);
|
||||
if ((err == X502_ERR_OK) && (rdy_size != NULL))
|
||||
*rdy_size = rdy_par.rdy_size;
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_load_start(t_x502_hnd hnd, uint32_t ch, uint32_t size, uint32_t min_irq_step) {
|
||||
t_lpcie_cycle_set_par par;
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
par.size = size;
|
||||
par.irq_step = min_irq_step;
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_LOAD, &par);
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_setup(t_x502_hnd hnd, uint32_t ch, uint32_t evt) {
|
||||
t_lpcie_cycle_evt_par par;
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
par.evt = evt;
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_SWITCH, &par);
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_stop(t_x502_hnd hnd, uint32_t ch, uint32_t evt) {
|
||||
t_lpcie_cycle_evt_par par;
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
par.evt = evt;
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_STOP, &par);
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_check_setup(t_x502_hnd hnd, uint32_t ch, uint32_t *done) {
|
||||
t_lpcie_cycle_check_setup_par par;
|
||||
int32_t err;
|
||||
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
err = f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_CHECK_SETUP, &par);
|
||||
if (err == X502_ERR_OK)
|
||||
*done = par.done;
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_renew_info(t_x502_hnd hnd) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_RELOAD_DEVINFO, NULL);
|
||||
}
|
||||
|
||||
int32_t l502_port_get_drv_ver(t_x502_hnd hnd, uint32_t *ver) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_GET_DRV_VERSION, ver);
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_stream_read(t_x502_hnd hnd, uint32_t *buff, uint32_t size, uint32_t timeout) {
|
||||
struct timeval tmval = {timeout/1000, (timeout%1000)*1000};
|
||||
uint32_t rcv_size = 0;
|
||||
int out = 0;
|
||||
int32_t err = X502_ERR_OK;
|
||||
while (!out && (err == X502_ERR_OK) && (rcv_size < size)) {
|
||||
fd_set rd_set;
|
||||
int sel = 0;
|
||||
|
||||
FD_ZERO(&rd_set);
|
||||
FD_SET(L502_PCI_IFACE_FILE(hnd), &rd_set);
|
||||
sel = select(L502_PCI_IFACE_FILE(hnd)+1, &rd_set, NULL, NULL, &tmval);
|
||||
if ((sel > 0) && (FD_ISSET(L502_PCI_IFACE_FILE(hnd), &rd_set))) {
|
||||
ssize_t rd = read(L502_PCI_IFACE_FILE(hnd), &buff[rcv_size], (size-rcv_size)*4);
|
||||
if (rd>0) {
|
||||
rcv_size += rd/4;
|
||||
} else if (rd == 0) {
|
||||
out = 1;
|
||||
} else {
|
||||
err = X502_ERR_RECV;
|
||||
}
|
||||
} else if (sel==0) {
|
||||
out = 1;
|
||||
} else {
|
||||
err = X502_ERR_RECV;
|
||||
}
|
||||
}
|
||||
return err != X502_ERR_OK ? err : (int32_t)rcv_size;
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_stream_write(t_x502_hnd hnd, const uint32_t *buff, uint32_t size,
|
||||
uint32_t timeout) {
|
||||
struct timeval tmval = {timeout/1000, (timeout%1000)*1000};
|
||||
uint32_t snd_size = 0;
|
||||
int32_t err = X502_ERR_OK;
|
||||
int out = 0;
|
||||
|
||||
while (!out && (err == X502_ERR_OK) && (snd_size < size)) {
|
||||
fd_set wr_set;
|
||||
int sel = 0;
|
||||
|
||||
FD_ZERO(&wr_set);
|
||||
FD_SET(L502_PCI_IFACE_FILE(hnd), &wr_set);
|
||||
sel = select(L502_PCI_IFACE_FILE(hnd)+1, NULL, &wr_set, NULL, &tmval);
|
||||
if ((sel > 0) && (FD_ISSET(L502_PCI_IFACE_FILE(hnd), &wr_set))) {
|
||||
ssize_t wr = write(L502_PCI_IFACE_FILE(hnd), &buff[snd_size], (size-snd_size)*4);
|
||||
if (wr > 0) {
|
||||
snd_size += wr/4;
|
||||
} else if (wr==0) {
|
||||
out = 1;
|
||||
} else {
|
||||
err = X502_ERR_SEND;
|
||||
}
|
||||
} else if (sel==0) {
|
||||
out = 1;
|
||||
} else {
|
||||
err = X502_ERR_SEND;
|
||||
}
|
||||
}
|
||||
return err != X502_ERR_OK ? err : (int32_t)snd_size;
|
||||
}
|
||||
|
||||
|
||||
static int32_t f_get_file_par(const char *path, char *filebuf,
|
||||
const char *file, char *res, uint32_t req_size,
|
||||
uint32_t *read_size) {
|
||||
int f;
|
||||
int32_t err = X502_ERR_OK;
|
||||
strcpy(filebuf, path);
|
||||
strcat(filebuf, file);
|
||||
|
||||
f = open (filebuf, O_RDONLY);
|
||||
if (f == -1) {
|
||||
err = X502_ERR_GET_INFO;
|
||||
} else {
|
||||
ssize_t rd = read(f, res, req_size);
|
||||
if (rd < 0) {
|
||||
err = X502_ERR_GET_INFO;
|
||||
} else {
|
||||
if (read_size!=NULL)
|
||||
*read_size = rd;
|
||||
}
|
||||
close(f);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static void f_del_eol(char *str) {
|
||||
for ( ; *str; str++) {
|
||||
if ((*str=='\n') || (*str=='\r'))
|
||||
*str = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t f_fill_devlist(const char *devname, t_x502_devrec *info) {
|
||||
int32_t err = 0;
|
||||
|
||||
int path_len = strlen(devname) + strlen(LPCIE_CLASS_DIR) + 2;
|
||||
char *filename = malloc(path_len + 21);
|
||||
char *path = malloc(path_len);
|
||||
|
||||
if ((filename != NULL) && (path != NULL)) {
|
||||
sprintf(path, LPCIE_CLASS_DIR "/%s", devname);
|
||||
|
||||
err = f_get_file_par(path, filename, "/name", info->devname,
|
||||
sizeof(info->devname), NULL);
|
||||
if (err == X502_ERR_OK)
|
||||
f_del_eol(info->devname);
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
/* получаем серийный номер устройства */
|
||||
err = f_get_file_par(path, filename, "/sn", info->serial,
|
||||
sizeof(info->serial), NULL);
|
||||
if (err == X502_ERR_OK)
|
||||
f_del_eol(info->serial);
|
||||
}
|
||||
|
||||
/* получаем информацию, открыто ли устройство */
|
||||
if (err == X502_ERR_OK) {
|
||||
char val = '0';
|
||||
err = f_get_file_par(path, filename, "/opened", &val, 1, NULL);
|
||||
if ((err == X502_ERR_OK) && (val!='0'))
|
||||
info->flags |= X502_DEVFLAGS_DEVREC_OPENED;
|
||||
}
|
||||
|
||||
/* получаем информацию, присутствует ли BlackFin */
|
||||
if (err == X502_ERR_OK) {
|
||||
char val = '0';
|
||||
if ((f_get_file_par(path, filename, "/bf", &val, 1, NULL) == X502_ERR_OK)
|
||||
&& (val != '0')) {
|
||||
info->flags |= X502_DEVFLAGS_BF_PRESENT;
|
||||
}
|
||||
|
||||
if ((f_get_file_par(path, filename, "/dac", &val, 1, NULL) == X502_ERR_OK)
|
||||
&& (val != '0')) {
|
||||
info->flags |= X502_DEVFLAGS_DAC_PRESENT;
|
||||
}
|
||||
|
||||
if ((f_get_file_par(path, filename, "/gal", &val, 1, NULL) == X502_ERR_OK)
|
||||
&& (val != '0')) {
|
||||
info->flags |= X502_DEVFLAGS_GAL_PRESENT;
|
||||
}
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
char *devname_cpy = malloc(strlen(devname)+1);
|
||||
if (devname_cpy!=NULL) {
|
||||
strcpy(devname_cpy, devname);
|
||||
err = l502_devlist_gen(info, devname_cpy);
|
||||
if (err != X502_ERR_OK) {
|
||||
free(devname_cpy);
|
||||
}
|
||||
} else {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
|
||||
free(filename);
|
||||
free(path);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_free_iface_data(void *intptr) {
|
||||
free(intptr);
|
||||
return X502_ERR_OK;
|
||||
}
|
||||
|
||||
int32_t l502_port_open(t_x502_hnd hnd, const t_x502_devrec *devinfo) {
|
||||
const char *devname = (const char *)devinfo->internal->iface_data;
|
||||
int32_t err = X502_ERR_OK;
|
||||
int path_len = strlen(devname)+6;
|
||||
char *path = malloc(path_len);
|
||||
|
||||
if (path != NULL) {
|
||||
int file;
|
||||
snprintf(path, path_len, "/dev/%s", devname);
|
||||
file = open(path, O_RDWR);
|
||||
if (file != -1) {
|
||||
hnd->iface_data = malloc(sizeof(t_pci_iface_data));
|
||||
if (hnd->iface_data == NULL) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
close(file);
|
||||
} else {
|
||||
L502_PCI_IFACE_FILE(hnd) = file;
|
||||
}
|
||||
} else {
|
||||
/** @todo Разобрать коды ошибок */
|
||||
err = X502_ERR_DEVICE_OPEN;
|
||||
}
|
||||
free(path);
|
||||
} else {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_close(t_x502_hnd hnd) {
|
||||
if (hnd->iface_data !=NULL) {
|
||||
close(L502_PCI_IFACE_FILE(hnd));
|
||||
free(hnd->iface_data);
|
||||
hnd->iface_data = NULL;
|
||||
}
|
||||
return X502_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
X502_EXPORT(int32_t) L502_GetDevRecordsList(t_x502_devrec *list, uint32_t size,
|
||||
uint32_t flags, uint32_t *devcnt) {
|
||||
uint32_t curcnt = 0;
|
||||
int32_t err = X502_ERR_OK;
|
||||
/* все устройства, поддерживаемые драйвером LPCIE, создают папку
|
||||
в директории класса устройств lpcie*/
|
||||
DIR *class_dir = opendir(LPCIE_CLASS_DIR);
|
||||
if (class_dir!=NULL) {
|
||||
struct dirent *dev_ent;
|
||||
/* читаем все записи в директории класса */
|
||||
while ((dev_ent=readdir(class_dir))!=NULL) {
|
||||
/* проверяем, что имя начинается с lpcie */
|
||||
if (!memcmp(dev_ent->d_name, "lpcie", sizeof("lpcie")-1)) {
|
||||
t_x502_devrec info;
|
||||
int info_used = 0;
|
||||
X502_DevRecordInit(&info);
|
||||
|
||||
/* получаем информацию о устройстве из служебных файлов,
|
||||
* предоставляемых драйвером */
|
||||
if (f_fill_devlist(dev_ent->d_name, &info) == X502_ERR_OK) {
|
||||
/* если нужны только не открытые, то уже открытое
|
||||
* устройство пропускаем */
|
||||
if (!(flags & X502_GETDEVS_FLAGS_ONLY_NOT_OPENED) ||
|
||||
!(info.flags & X502_DEVFLAGS_DEVREC_OPENED)) {
|
||||
/* если есть место в списке - то сохраняем
|
||||
* полученную информацию */
|
||||
if ((list!=NULL) && (curcnt < size)) {
|
||||
list[curcnt] = info;
|
||||
info_used = 1;
|
||||
}
|
||||
curcnt++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!info_used)
|
||||
X502_FreeDevRecordList(&info,1);
|
||||
}
|
||||
}
|
||||
closedir(class_dir);
|
||||
}
|
||||
|
||||
if (devcnt != NULL)
|
||||
*devcnt = curcnt;
|
||||
|
||||
return err != X502_ERR_OK ? err : curcnt > size ? (int32_t)size : (int32_t)curcnt ;
|
||||
}
|
||||
144
l502/lpcie_ioctls.h
Normal file
144
l502/lpcie_ioctls.h
Normal file
@ -0,0 +1,144 @@
|
||||
/***************************************************************************//**
|
||||
* @file lpcie_ioctls.h
|
||||
* Файл содержит определения управляющих запросов драйвера lpcie и типов данных,
|
||||
* используемых для передачи параметров управляющих запросов
|
||||
* @author Borisov Alexey <borisov@lcard.ru>
|
||||
* @date 23.05.2012
|
||||
* ****************************************************************************/
|
||||
#ifndef LPCIE_IOCTLS_H
|
||||
#define LPCIE_IOCTLS_H
|
||||
|
||||
/** Проверка по версии дарайвера, поддерживается ли запрос LPCIE_IOCTL_CYCLE_CHECK_SETUP */
|
||||
#define LPCIE_IOCTL_SUPPORT_CYCLE_CHECK_SETUP(ver) (ver >= 0x01000900)
|
||||
|
||||
/** Варианты событий, по которым должно произойти переключение
|
||||
циклического сигнала */
|
||||
typedef enum {
|
||||
LPCIE_CYCLE_SW_EVT_IMMIDIATLY = 1, /**< сразу по получению команды */
|
||||
LPCIE_CYCLE_SW_EVT_END_OF_CYCLE = 2 /**< по завершению текущего цикла */
|
||||
} t_lpcie_cycle_sw_evt;
|
||||
|
||||
|
||||
/** параметры для записи значения регистра */
|
||||
typedef struct {
|
||||
uint32_t addr; /** Адрес регистра */
|
||||
uint32_t val; /** Значение регистра */
|
||||
} t_lpcie_mem_rw;
|
||||
|
||||
/** настройки канала DMA, передаваемые вместе с LPCIE_IOCTL_STREAM_SET_PARAMS */
|
||||
typedef struct {
|
||||
uint32_t ch; /** канал DMA (ввод/вывод) */
|
||||
uint32_t res[2]; /** резерв */
|
||||
uint32_t buf_size; /** размер каждой страницы памяти в PC */
|
||||
uint32_t irq_step; /** через сколько переданных отсчетов будет
|
||||
генерироваться прерывание */
|
||||
uint32_t res2[3];
|
||||
} t_lpcie_stream_ch_params;
|
||||
|
||||
/** параметры для установки циклического сигнала */
|
||||
typedef struct {
|
||||
uint32_t ch; /** канал DMA (доступно только на вывод) */
|
||||
uint32_t size; /** количество отсчетов в циклическом сигнале */
|
||||
uint32_t irq_step; /** шаг генерации прерываний */
|
||||
uint32_t res; /** резерв */
|
||||
} t_lpcie_cycle_set_par;
|
||||
|
||||
/** параметры для остановки/смены циклического сигнала */
|
||||
typedef struct {
|
||||
uint32_t ch; /** канал DMA (доступно только на вывод) */
|
||||
uint32_t evt; /** событие для смены сигнала из #t_lpcie_cycle_sw_evt */
|
||||
uint32_t res[2]; /** резерв */
|
||||
} t_lpcie_cycle_evt_par;
|
||||
|
||||
/** параметры для запроса LPCIE_IOCTL_CYCLE_CHECK_SETUP */
|
||||
typedef struct {
|
||||
uint32_t ch; /** канал DMA (доступно только на вывод) */
|
||||
uint32_t done; /** признак, завершена ли установка циклического сигнала */
|
||||
} t_lpcie_cycle_check_setup_par;
|
||||
|
||||
/** параметры запроса для получения количества готовых для ввода или вывода
|
||||
отсчетов */
|
||||
typedef struct {
|
||||
uint32_t ch; /** канал DMA (ввод/вывод) */
|
||||
uint32_t rdy_size; /** Количество отсчетов доступных на ввод или вывод */
|
||||
} t_lpcie_get_rdy_par;
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
#define LPCIE_IOCTL_GET_DRV_VERSION \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED , FILE_ANY_ACCESS)
|
||||
|
||||
|
||||
#define LPCIE_IOCTL_MEMFPGA_RD \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED , FILE_ANY_ACCESS)
|
||||
|
||||
#define LPCIE_IOCTL_MEMFPGA_WR \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED , FILE_ANY_ACCESS)
|
||||
|
||||
#define LPCIE_IOCTL_POWER_DONW \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_BUFFERED , FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_RELOAD_DEVINFO \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED , FILE_ANY_ACCESS)
|
||||
|
||||
|
||||
|
||||
#define LPCIE_IOCTL_STREAM_SET_PARAMS \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x840, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_STREAM_GET_PARAMS \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x841, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_STREAM_GET_RDY_SIZE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x842, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#define LPCIE_IOCTL_STREAM_START \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x844, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_STREAM_STOP \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x845, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_STREAM_FREE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x846, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_STREAM_START_SINGLE \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x847, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_CYCLE_LOAD \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x850, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_CYCLE_SWITCH \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x851, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_CYCLE_STOP \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x852, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
#define LPCIE_IOCTL_CYCLE_CHECK_SETUP \
|
||||
CTL_CODE(FILE_DEVICE_UNKNOWN, 0x853, METHOD_BUFFERED, FILE_ANY_ACCESS)
|
||||
|
||||
#else
|
||||
|
||||
#define LPCIE_IO_MAGIC 'L'
|
||||
|
||||
#define LPCIE_IOCTL_GET_DRV_VERSION _IOR(LPCIE_IO_MAGIC, 0x800, uint32_t)
|
||||
|
||||
#define LPCIE_IOCTL_MEMFPGA_RD _IOWR(LPCIE_IO_MAGIC, 0x810, t_lpcie_mem_rw)
|
||||
#define LPCIE_IOCTL_MEMFPGA_WR _IOW(LPCIE_IO_MAGIC, 0x811, t_lpcie_mem_rw)
|
||||
|
||||
#define LPCIE_IOCTL_POWER_DONW _IO(LPCIE_IO_MAGIC, 0x820)
|
||||
#define LPCIE_IOCTL_RELOAD_DEVINFO _IO(LPCIE_IO_MAGIC, 0x821)
|
||||
|
||||
|
||||
#define LPCIE_IOCTL_STREAM_SET_PARAMS _IOW(LPCIE_IO_MAGIC, 0x840, t_lpcie_stream_ch_params)
|
||||
#define LPCIE_IOCTL_STREAM_GET_PARAMS _IOWR(LPCIE_IO_MAGIC, 0x841, t_lpcie_stream_ch_params)
|
||||
#define LPCIE_IOCTL_STREAM_GET_RDY_SIZE _IOWR(LPCIE_IO_MAGIC, 0x842, t_lpcie_get_rdy_par)
|
||||
|
||||
|
||||
#define LPCIE_IOCTL_STREAM_START _IOW(LPCIE_IO_MAGIC, 0x844, uint32_t)
|
||||
#define LPCIE_IOCTL_STREAM_STOP _IOW(LPCIE_IO_MAGIC, 0x845, uint32_t)
|
||||
#define LPCIE_IOCTL_STREAM_FREE _IOW(LPCIE_IO_MAGIC, 0x846, uint32_t)
|
||||
#define LPCIE_IOCTL_STREAM_START_SINGLE _IOW(LPCIE_IO_MAGIC, 0x847, uint32_t)
|
||||
|
||||
#define LPCIE_IOCTL_CYCLE_LOAD _IOW(LPCIE_IO_MAGIC, 0x850, t_lpcie_cycle_set_par)
|
||||
#define LPCIE_IOCTL_CYCLE_SWITCH _IOW(LPCIE_IO_MAGIC, 0x851, t_lpcie_cycle_evt_par)
|
||||
#define LPCIE_IOCTL_CYCLE_STOP _IOW(LPCIE_IO_MAGIC, 0x852, t_lpcie_cycle_evt_par)
|
||||
#define LPCIE_IOCTL_CYCLE_CHECK_SETUP _IOWR(LPCIE_IO_MAGIC, 0x853, t_lpcie_cycle_check_setup_par)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // LPCIE_IOCTLS_H
|
||||
805
l502/pas/l502api.pas
Normal file
805
l502/pas/l502api.pas
Normal file
@ -0,0 +1,805 @@
|
||||
unit l502api;
|
||||
interface
|
||||
uses Windows, SysUtils, x502api;
|
||||
|
||||
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_GetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
|
||||
function L502_GetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_Open(hnd: t_x502_hnd; serial: string): LongInt; stdcall;
|
||||
|
||||
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
|
||||
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
|
||||
|
||||
|
||||
|
||||
{ ----------- <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----------}
|
||||
const
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_LTABLE_MAX_CH_CNT = 256;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ADC_RANGE_CNT = 6;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_LCH_AVG_SIZE_MAX = 128;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_ADC_FREQ_DIV_MAX = (1024*1024);
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DIN_FREQ_DIV_MAX = (1024*1024);
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>
|
||||
L502_ADC_INTERFRAME_DELAY_MAX = $1FFFFF;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> BlackFin
|
||||
L502_BF_CMD_DEFAULT_TOUT = 500;
|
||||
|
||||
// <20><><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ADC_SCALE_CODE_MAX = 6000000;
|
||||
// <20><><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DAC_SCALE_CODE_MAX = 30000;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DEVNAME_SIZE = X502_DEVNAME_SIZE;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_SERIAL_SIZE = X502_SERIAL_SIZE;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_FLASH_USER_SIZE = $100000;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> BlackFin <20> <20><>
|
||||
L502_BF_REQ_TOUT = 500;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DAC_RANGE = 5;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_DAC_CH_CNT = 2;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_STREAM_IN_MSG_OVERFLOW = $01010000;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_EXT_REF_FREQ_MAX = 2000000;
|
||||
|
||||
|
||||
{ ----------------- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---------------------------}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_OK = 0;
|
||||
// <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_HANDLE = -1;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_MEMORY_ALLOC = -2;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_ALREADY_OPENED = -3;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_DEVICE_NOT_FOUND = -4;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>-<2D><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
L502_ERR_DEVICE_ACCESS_DENIED = -5;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_DEVICE_OPEN = -6;
|
||||
// <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_POINTER = -7;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_STREAM_IS_RUNNING = -8;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_RECV = -9;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_SEND = -10;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_STREAM_OVERFLOW = -11;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_UNSUP_STREAM_MSG = -12;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_MUTEX_CREATE = -13;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_MUTEX_INVALID_HANDLE = -14;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_MUTEX_LOCK_TOUT = -15;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_MUTEX_RELEASE = -16;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INSUFFICIENT_SYSTEM_RESOURCES= -17;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_NOT_IMPLEMENTED = -18;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INSUFFICIENT_ARRAY_SIZE = -19;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FPGA
|
||||
L502_ERR_FPGA_REG_READ = -20;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FPGA
|
||||
L502_ERR_FPGA_REG_WRITE = -21;
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_STREAM_IS_NOT_RUNNING = -22;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_LTABLE_SIZE = -102;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_LCH_NUMBER = -103;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_ERR_INVALID_LCH_RANGE = -104;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_LCH_MODE = -105;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_LCH_PHY_NUMBER = -106;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_LCH_AVG_SIZE = -107;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_ERR_INVALID_ADC_FREQ_DIV = -108;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_DIN_FREQ_DIV = -108;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502
|
||||
L502_ERR_INVALID_MODE = -109;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_ERR_INVALID_DAC_CHANNEL = -110;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_REF_FREQ = -111;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_INTERFRAME_DELAY = -112;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_INVALID_SYNC_MODE = -113;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA
|
||||
L502_ERR_INVALID_DMA_CH = -114;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_REF_FREQ_NOT_LOCKED = -131;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_IOCTL_FAILD = -132;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_IOCTL_TIMEOUT = -133;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_GET_INFO = -134;
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_DIG_IN_NOT_RDY = -135;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_RECV_INSUFFICIENT_WORDS = -136;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_DAC_NOT_PRESENT = -137;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_PROC_INVALID_CH_NUM = -140;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_PROC_INVALID_CH_RANGE = -141;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_FLASH_INVALID_ADDR = -142;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_FLASH_INVALID_SIZE = -143;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_FLASH_WRITE_TOUT = -144;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_FLASH_ERASE_TOUT = -145;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> 4 <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_FLASH_SECTOR_BOUNDARY = -146;
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_ERR_LDR_FILE_OPEN = -180;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_ERR_LDR_FILE_READ = -181;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_ERR_LDR_FILE_FORMAT = -182;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LDR-<2D><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin <20><> HDMA
|
||||
L502_ERR_LDR_FILE_UNSUP_FEATURE = -183;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_ERR_LDR_FILE_UNSUP_STARTUP_ADDR = -184;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_ERR_BF_REQ_TIMEOUT = -185;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> BlackFin <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_BF_CMD_IN_PROGRESS = -186;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_ERR_BF_CMD_TIMEOUT = -187;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> BlackFin
|
||||
L502_ERR_BF_CMD_RETURN_INSUF_DATA = -188;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_BF_LOAD_RDY_TOUT = -189;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_ERR_BF_NOT_PRESENT = -190;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> HDMA
|
||||
L502_ERR_BF_INVALID_ADDR = -191;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> BlackFin
|
||||
L502_ERR_BF_INVALID_CMD_DATA_SIZE = -192;
|
||||
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_GETDEVS_FLAGS_ONLY_NOT_OPENED = X502_GETDEVS_FLAGS_ONLY_NOT_OPENED;
|
||||
|
||||
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. ---------------}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DIGOUT_WORD_DIS_H = $00020000;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DIGOUT_WORD_DIS_L = $00010000;
|
||||
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------------}
|
||||
L502_REF_FREQ_2000KHZ = 2000000; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32><EFBFBD>
|
||||
L502_REF_FREQ_1500KHZ = 1500000; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> ----------------------}
|
||||
L502_ADC_RANGE_10 = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +/-10V
|
||||
L502_ADC_RANGE_5 = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +/-5V
|
||||
L502_ADC_RANGE_2 = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +/-2V
|
||||
L502_ADC_RANGE_1 = 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +/-1V
|
||||
L502_ADC_RANGE_05 = 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +/-0.5V
|
||||
L502_ADC_RANGE_02 = 5; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +/-0.2V
|
||||
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------}
|
||||
L502_LCH_MODE_COMM = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_LCH_MODE_DIFF = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_LCH_MODE_ZERO = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------------------------}
|
||||
L502_SYNC_INTERNAL = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_SYNC_EXTERNAL_MASTER = 1; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_SYNC_DI_SYN1_RISE = 2; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DI_SYN1
|
||||
L502_SYNC_DI_SYN2_RISE = 3; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DI_SYN2
|
||||
L502_SYNC_DI_SYN1_FALL = 6; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DI_SYN1
|
||||
L502_SYNC_DI_SYN2_FALL = 7; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DI_SYN2
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------------}
|
||||
L502_PROC_FLAGS_VOLT = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
{-------- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -----------------}
|
||||
L502_STREAM_ADC = $01; //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>
|
||||
L502_STREAM_DIN = $02; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_STREAM_DAC1 = $10; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_STREAM_DAC2 = $20; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_STREAM_DOUT = $40; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
||||
L502_STREAM_ALL_IN = L502_STREAM_ADC or L502_STREAM_DIN;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_STREAM_ALL_OUT = L502_STREAM_DAC1 or L502_STREAM_DAC2 or L502_STREAM_DOUT;
|
||||
|
||||
|
||||
{--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -----}
|
||||
L502_STREAM_OUT_WORD_TYPE_DOUT = $0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_STREAM_OUT_WORD_TYPE_DAC1 = $40000000; // <20><><EFBFBD> <20><><EFBFBD> 1-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_STREAM_OUT_WORD_TYPE_DAC2 = $80000000; // <20><><EFBFBD> <20><><EFBFBD> 2-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
|
||||
{------------------ <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502 ------------------------------}
|
||||
L502_MODE_FPGA = 0; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_MODE_DSP = 1; // <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_MODE_DEBUG = 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
{------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> -----------------------------------}
|
||||
L502_DAC_CH1 = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_DAC_CH2 = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
|
||||
{----------- <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> -----------------}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DAC_FLAGS_VOLT = $0001;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>.
|
||||
L502_DAC_FLAGS_CALIBR = $0002;
|
||||
|
||||
{------------------ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA ------------------------------------}
|
||||
L502_DMA_CH_IN = 0; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> DMA <20><> <20><><EFBFBD><EFBFBD>
|
||||
L502_DMA_CH_OUT = 1; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> DMA <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
{--- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----}
|
||||
L502_PULLUPS_DI_H = $01; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_PULLUPS_DI_L = $02; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_PULLUPS_DI_SYN1 = $04; // <20><><EFBFBD><EFBFBD><EFBFBD> SYN1
|
||||
L502_PULLUPS_DI_SYN2 = $08; // <20><><EFBFBD><EFBFBD><EFBFBD> SYN2
|
||||
|
||||
|
||||
|
||||
{--------------- <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---------------}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_DEVFLAGS_DAC_PRESENT = X502_DEVFLAGS_DAC_PRESENT;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin
|
||||
L502_DEVFLAGS_BF_PRESENT = X502_DEVFLAGS_BF_PRESENT;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DEVFLAGS_GAL_PRESENT = X502_DEVFLAGS_GAL_PRESENT;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
L502_DEVFLAGS_FLASH_DATA_VALID = $00010000;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_DEVFLAGS_FLASH_ADC_CALIBR_VALID = $00020000;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
L502_DEVFLAGS_FLASH_DAC_CALIBR_VALID = $00040000;
|
||||
|
||||
{----------------<2D><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>----------------------}
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
L502_OUT_CYCLE_FLAGS_FORCE = $01;
|
||||
|
||||
|
||||
type
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
t_l502_hnd = t_x502_hnd;
|
||||
|
||||
|
||||
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> }
|
||||
t_l502_cbr_coef = record
|
||||
offs: Double; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
k : Double; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
end;
|
||||
|
||||
|
||||
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. }
|
||||
t_l502_cbr = record
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
adc: array[0..L502_ADC_RANGE_CNT-1] of t_l502_cbr_coef;
|
||||
res1: array[0..63] of LongWord;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
dac: array[0..L502_DAC_CH_CNT-1] of t_l502_cbr_coef;
|
||||
res2: array[0..19] of LongWord;
|
||||
end;
|
||||
|
||||
{ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> L502.}
|
||||
t_l502_info = record
|
||||
name: array[0..L502_DEVNAME_SIZE-1] of AnsiChar; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ("L502")
|
||||
serial: array[0..L502_SERIAL_SIZE-1] of AnsiChar; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
devflags: LongWord; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
fpga_ver : Word; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
plda_ver : Byte; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
res : array[0..120] of Byte; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
cbr : t_l502_cbr; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
end;
|
||||
|
||||
function L502_Create(): t_l502_hnd; stdcall;
|
||||
function L502_Free(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_Close(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_GetDevInfo(hnd: t_l502_hnd; out info: t_l502_info) : LongInt; stdcall;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_Configure(hnd: t_l502_hnd; flags: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_SetLChannel(hnd: t_l502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_SetLChannelCount(hnd: t_l502_hnd; lch_cnt : LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_GetLChannelCount(hnd: t_l502_hnd; out lch_cnt: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>
|
||||
function L502_SetAdcFreqDivider(hnd: t_l502_hnd; adc_freq_div : LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>
|
||||
function L502_SetAdcInterframeDelay(hnd: t_l502_hnd; delay : LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_SetDinFreqDivider(hnd: t_l502_hnd; din_freq_div: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
function L502_SetAdcFreq(hnd: t_l502_hnd; var f_acq, f_frame: Double): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_SetDinFreq(hnd: t_l502_hnd; var f_din: Double): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
function L502_GetAdcFreq(hnd: t_l502_hnd; out f_acq, f_frame: Double): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_SetRefFreq(hnd: t_l502_hnd; freq: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_SetSyncMode(hnd: t_l502_hnd; sync_mode: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_SetSyncStartMode(hnd: t_l502_hnd; sync_start_mode: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_SetMode(hnd: t_l502_hnd; mode: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_GetMode(hnd: t_l502_hnd; out mode: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
|
||||
function L502_SetAdcCoef(hnd: t_l502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
|
||||
function L502_GetAdcCoef(hnd: t_l502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall;
|
||||
|
||||
|
||||
{----------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
|
||||
function L502_AsyncOutDac(hnd: t_l502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_AsyncOutDig(hnd: t_l502_hnd; val, msk: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_AsyncInDig(hnd: t_l502_hnd; out din: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>.
|
||||
function L502_AsyncGetAdcFrame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
|
||||
|
||||
|
||||
{-------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ----}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_StreamsEnable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_StreamsDisable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_StreamsStart(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_StreamsStop(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_IsRunning(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_Recv(hnd: t_l502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_Send(hnd: t_l502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_ProcessAdcData(hnd: t_l502_hnd; const src: array of LongWord;
|
||||
out dest: array of Double; var size : LongWord;
|
||||
flags : LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_ProcessData(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
|
||||
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
|
||||
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_ProcessDataWithUserExt(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
|
||||
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
|
||||
out din_data: array of LongWord; var din_data_size: LongWord;
|
||||
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_PrepareData(hnd: t_l502_hnd; const dac1, dac2: array of Double;
|
||||
const digout: array of LongWord; size, flags : LongWord;
|
||||
out out_buf: array of LongWord):LongInt; stdcall;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
|
||||
function L502_GetRecvReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_GetSendReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_GetNextExpectedLchNum(hnd: t_l502_hnd; out lch: LongWord):LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_PreloadStart(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_OutCycleLoadStart(hnd: t_l502_hnd; size: LongWord):LongInt; stdcall;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_OutCycleSetup(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_OutCycleStop(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_SetDmaBufSize(hnd: t_l502_hnd; dma_ch, size: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> DMA.
|
||||
function L502_SetDmaIrqStep(hnd: t_l502_hnd; dma_ch, step: LongWord): LongInt; stdcall;
|
||||
|
||||
{------------ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------------}
|
||||
function L502_BfCheckFirmwareIsLoaded(hnd: t_l502_hnd; out version: LongWord): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BlackFin.
|
||||
function L502_BfLoadFirmware(hnd: t_l502_hnd; filename: string): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_BfMemRead(hnd: t_l502_hnd; addr : LongWord; out regs: array of LongWord;
|
||||
size: LongWord): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_BfMemWrite(hnd: t_l502_hnd; addr : LongWord;
|
||||
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_BfExecCmd(hnd: t_l502_hnd; cmd_code : Word; par : LongWord;
|
||||
const snd_data : array of LongWord; snd_size : LongWord;
|
||||
out rcv_data : array of LongWord; rcv_size : LongWord;
|
||||
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
|
||||
|
||||
{------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------}
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_FlashRead(hnd: t_l502_hnd; addr: LongWord;
|
||||
out data: array of Byte; size: LongWord): LongInt; stdcall;
|
||||
///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_FlashWrite(hnd: t_l502_hnd; addr: LongWord;
|
||||
const data: array of Byte; size: LongWord): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_FlashErase(hnd: t_l502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_FlashWriteEnable(hnd: LongWord): LongInt; stdcall;
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_FlashWriteDisable(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
|
||||
{----------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------}
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_GetDllVersion() : LongWord; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_GetDriverVersion(hnd: t_l502_hnd; out ver: LongWord): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
function L502_GetErrorString(err: LongInt) : string; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_LedBlink(hnd: t_l502_hnd): LongInt; stdcall;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_SetDigInPullup(hnd: t_l502_hnd; pullups : LongWord): LongInt; stdcall;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
implementation
|
||||
function L502_Create() : t_l502_hnd; stdcall; external 'l502api.dll';
|
||||
function L502_Free(hnd: t_l502_hnd) : LongInt; stdcall; external 'l502api.dll';
|
||||
function _get_serials( ser_arr: p_x502_serial_array; size:LongWord;
|
||||
flags:LongWord; out devcnt: LongWord) : LongInt;
|
||||
stdcall; external 'l502api.dll' name 'L502_GetSerialList';
|
||||
function _get_dev_records_list(out list; size:LongWord;
|
||||
flags : LongWord; out devcnt: LongWord) : LongInt;
|
||||
stdcall; external 'l502api.dll' name 'L502_GetDevRecordsList';
|
||||
|
||||
function _open(hnd: t_l502_hnd; serial: PAnsiChar) : LongInt; stdcall; external 'l502api.dll' name 'L502_Open';
|
||||
function L502_Close(hnd : t_l502_hnd) : LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetDevInfo(hnd : t_l502_hnd; out info : t_l502_info) : LongInt; stdcall; external 'l502api.dll';
|
||||
|
||||
function L502_Configure(hnd: t_l502_hnd; flags: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetLChannel(hnd: t_l502_hnd; lch, phy_ch, mode, range, avg: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetLChannelCount(hnd: t_l502_hnd; lch_cnt : LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetLChannelCount(hnd: t_l502_hnd; out lch_cnt: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetAdcFreqDivider(hnd: t_l502_hnd; adc_freq_div : LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetAdcInterframeDelay(hnd: t_l502_hnd; delay : LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetDinFreqDivider(hnd: t_l502_hnd; din_freq_div: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetAdcFreq(hnd: t_l502_hnd; var f_acq, f_frame: Double): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetDinFreq(hnd: t_l502_hnd; var f_din: Double): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetAdcFreq(hnd: t_l502_hnd; out f_acq, f_frame: Double): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetRefFreq(hnd: t_l502_hnd; freq: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetSyncMode(hnd: t_l502_hnd; sync_mode: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetSyncStartMode(hnd: t_l502_hnd; sync_start_mode: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetMode(hnd: t_l502_hnd; mode: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetMode(hnd: t_l502_hnd; out mode: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetAdcCoef(hnd: t_l502_hnd; range: LongWord; k, offs: Double): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetAdcCoef(hnd: t_l502_hnd; range: LongWord; out k, offs: Double): LongInt; stdcall; external 'l502api.dll';
|
||||
|
||||
function L502_AsyncOutDac(hnd: t_l502_hnd; ch: LongWord; data: Double; flags: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_AsyncOutDig(hnd: t_l502_hnd; val, msk: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_AsyncInDig(hnd: t_l502_hnd; out din: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function _get_adc_frame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data): LongInt; stdcall; external 'l502api.dll' name 'L502_AsyncGetAdcFrame';
|
||||
|
||||
function L502_StreamsEnable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_StreamsDisable(hnd: t_l502_hnd; streams: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_StreamsStart(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_IsRunning(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_StreamsStop(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
|
||||
function _recv(hnd: t_l502_hnd; out buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_Recv';
|
||||
function _send(hnd: t_l502_hnd; const buf; size: LongWord; tout : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_Send';
|
||||
function _process_adc_data(hnd: t_l502_hnd; const src; out dest; var size : LongWord;
|
||||
flags : LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessAdcData';
|
||||
function _process_data(hnd: t_l502_hnd; const src; size: LongWord;
|
||||
flags : LongWord; out adc_data; var adc_data_size : LongWord;
|
||||
out din_data; var din_data_size: LongWord):LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessData';
|
||||
|
||||
function _process_data_usr(hnd: t_l502_hnd; const src; size: LongWord;
|
||||
flags : LongWord; out adc_data; var adc_data_size : LongWord;
|
||||
out din_data; var din_data_size: LongWord;
|
||||
out usr_data; var usr_data_size: LongWord):LongInt; stdcall; external 'l502api.dll' name 'L502_ProcessDataWithUserExt';
|
||||
function _prepare_data(hnd: t_l502_hnd; const dac1, dac2; const digout; size, flags : LongWord;
|
||||
out out_buf):LongInt; stdcall; external 'l502api.dll' name 'L502_PrepareData';
|
||||
function L502_GetRecvReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetSendReadyCount(hnd: t_l502_hnd; out rdy_cnt: LongWord):LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_GetNextExpectedLchNum(hnd: t_l502_hnd; out lch: LongWord):LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_PreloadStart(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_OutCycleLoadStart(hnd: t_l502_hnd; size: LongWord):LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_OutCycleSetup(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_OutCycleStop(hnd: t_l502_hnd; flags: LongWord):LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetDmaBufSize(hnd: t_l502_hnd; dma_ch, size: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetDmaIrqStep(hnd: t_l502_hnd; dma_ch, step: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
|
||||
function L502_BfCheckFirmwareIsLoaded(hnd: t_l502_hnd; out version: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function _bf_load_firm(hnd: t_l502_hnd; filename: PAnsiChar): LongInt; stdcall; external 'l502api.dll' name 'L502_BfLoadFirmware';
|
||||
function _bf_mem_read(hnd: t_l502_hnd; addr : LongWord; out regs; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfMemRead';
|
||||
function _bf_mem_write(hnd: t_l502_hnd; addr : LongWord; const regs; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfMemWrite';
|
||||
function _bf_exec_cmd(hnd: t_l502_hnd; cmd_code : Word; par : LongWord;
|
||||
const snd_data; snd_size : LongWord; out rcv_data; rcv_size : LongWord;
|
||||
tout: LongWord; out recved_size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_BfExecCmd';
|
||||
|
||||
function _flash_read(hnd: t_l502_hnd; addr: LongWord; out data; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_FlashRead';
|
||||
function _flash_write(hnd: t_l502_hnd; addr: LongWord; const data; size: LongWord): LongInt; stdcall; external 'l502api.dll' name 'L502_FlashWrite';
|
||||
function L502_FlashErase(hnd: t_l502_hnd; addr: LongWord; size: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_FlashWriteEnable(hnd: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_FlashWriteDisable(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
|
||||
|
||||
function L502_GetDllVersion() : LongWord; stdcall; external 'l502api.dll';
|
||||
function L502_GetDriverVersion(hnd: t_l502_hnd; out ver: LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
function _get_err_str(err : LongInt) : PAnsiChar; stdcall; external 'l502api.dll' name 'L502_GetErrorString';
|
||||
function L502_LedBlink(hnd: t_l502_hnd): LongInt; stdcall; external 'l502api.dll';
|
||||
function L502_SetDigInPullup(hnd: t_l502_hnd; pullups : LongWord): LongInt; stdcall; external 'l502api.dll';
|
||||
|
||||
|
||||
{
|
||||
function L502_GetSerialList(out serials: t_l502_serial_list; flags: LongWord) : LongInt; overload;
|
||||
var
|
||||
ser_arr : p_l502_serial_array;
|
||||
devcnt: LongWord;
|
||||
res, i : LongInt;
|
||||
begin
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
res := _get_serials(nil, 0, flags, devcnt);
|
||||
if (res >= 0) and (devcnt>0) then
|
||||
begin
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> devcnt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ser_arr:=GetMemory(devcnt*L502_SERIAL_SIZE);
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
res:= _get_serials(ser_arr, devcnt, flags, PLongWord(nil)^);
|
||||
if (res > 0) then
|
||||
begin
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SetLength(serials, res);
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
for i:=0 to res-1 do
|
||||
serials[i] := string(ser_arr[i]);
|
||||
end;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
FreeMemory(ser_arr);
|
||||
end;
|
||||
L502_GetSerialList:= res;
|
||||
end;
|
||||
}
|
||||
|
||||
function L502_GetSerialList(out serials: array of string; flags: LongWord; out devcnt: LongWord) : LongInt; overload;
|
||||
var
|
||||
ser_arr : p_x502_serial_array;
|
||||
res, i : LongInt;
|
||||
begin
|
||||
if (Length(serials) > 0) then
|
||||
begin
|
||||
ser_arr:=GetMemory(Length(serials)*X502_SERIAL_SIZE);
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
res := _get_serials(ser_arr, Length(serials), flags, devcnt);
|
||||
if res >= 0 then
|
||||
begin
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
for i:=0 to res-1 do
|
||||
serials[i] := string(ser_arr[i]);
|
||||
end;
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
FreeMemory(ser_arr);
|
||||
end
|
||||
else
|
||||
begin
|
||||
res:= _get_serials(nil, 0, flags, devcnt);
|
||||
end;
|
||||
L502_GetSerialList:=res;
|
||||
end;
|
||||
|
||||
function L502_GetSerialList(out serials: array of string; flags: LongWord) : LongInt; overload;
|
||||
begin
|
||||
L502_GetSerialList:= L502_GetSerialList(serials, flags, PCardinal(nil)^);
|
||||
end;
|
||||
|
||||
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord; out devcnt: LongWord) : LongInt; overload;
|
||||
begin
|
||||
if (Length(list) > 0) then
|
||||
begin
|
||||
L502_GetDevRecordsList := _get_dev_records_list(list, Length(list), flags, devcnt);
|
||||
end
|
||||
else
|
||||
begin
|
||||
L502_GetDevRecordsList:= _get_dev_records_list(PCardinal(nil)^, 0, flags, devcnt);
|
||||
end;
|
||||
end;
|
||||
function L502_GetDevRecordsList(out list: array of t_x502_devrec; flags : LongWord) : LongInt; overload;
|
||||
begin
|
||||
L502_GetDevRecordsList:= L502_GetDevRecordsList(list, flags, PCardinal(nil)^);
|
||||
end;
|
||||
|
||||
function L502_Open(hnd: t_l502_hnd; serial: string) : LongInt;
|
||||
begin
|
||||
L502_Open:=_open(hnd, PAnsiChar(AnsiString(serial)));
|
||||
end;
|
||||
|
||||
function L502_GetErrorString(err: LongInt) : string;
|
||||
begin
|
||||
L502_GetErrorString:= string(_get_err_str(err));
|
||||
end;
|
||||
|
||||
function L502_AsyncGetAdcFrame(hnd: t_l502_hnd; flags: LongWord; tout: LongWord; out data: array of Double): LongInt; stdcall;
|
||||
var err: LongInt;
|
||||
lch_cnt: LongWord;
|
||||
begin
|
||||
err:= L502_GetLChannelCount(hnd, lch_cnt);
|
||||
if err=L502_ERR_OK then
|
||||
begin
|
||||
if LongWord(Length(data)) < lch_cnt then
|
||||
err:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
err:=_get_adc_frame(hnd,flags,tout,data);
|
||||
end;
|
||||
L502_AsyncGetAdcFrame:=err;
|
||||
end;
|
||||
|
||||
function L502_Recv(hnd: t_l502_hnd; out buf : array of LongWord; size: LongWord; tout : LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if LongWord(Length(buf)) < size then
|
||||
L502_Recv:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_Recv:=_recv(hnd, buf, size, tout);
|
||||
end;
|
||||
|
||||
function L502_Send(hnd: t_l502_hnd; const buf : array of LongWord; size: LongWord; tout: LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if LongWord(Length(buf)) < size then
|
||||
L502_Send:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_Send:=_send(hnd,buf,size,tout);
|
||||
end;
|
||||
|
||||
|
||||
function L502_ProcessAdcData(hnd: t_l502_hnd; const src: array of LongWord;
|
||||
out dest: array of Double; var size : LongWord;
|
||||
flags : LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(src)) < size) or (LongWord(Length(dest)) < size) then
|
||||
L502_ProcessAdcData:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_ProcessAdcData:=_process_adc_data(hnd, src, dest, size, flags);
|
||||
end;
|
||||
|
||||
function L502_ProcessData(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
|
||||
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
|
||||
out din_data: array of LongWord; var din_data_size: LongWord):LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
|
||||
or (LongWord(Length(src)) < size) then
|
||||
L502_ProcessData:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_ProcessData:=_process_data(hnd, src, size, flags, adc_data, adc_data_size, din_data, din_data_size);
|
||||
end;
|
||||
|
||||
function L502_ProcessDataWithUserExt(hnd: t_l502_hnd; const src: array of LongWord; size: LongWord;
|
||||
flags : LongWord; out adc_data: array of Double; var adc_data_size : LongWord;
|
||||
out din_data: array of LongWord; var din_data_size: LongWord;
|
||||
out usr_data: array of LongWord; var usr_data_size: LongWord):LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(adc_data)) < adc_data_size) or (LongWord(Length(din_data)) < din_data_size)
|
||||
or (LongWord(Length(src)) < size) or (LongWord(Length(usr_data)) < usr_data_size) then
|
||||
L502_ProcessDataWithUserExt:=L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_ProcessDataWithUserExt:=_process_data_usr(hnd, src,size,flags,adc_data,
|
||||
adc_data_size, din_data, din_data_size, usr_data, usr_data_size);
|
||||
end;
|
||||
|
||||
function L502_PrepareData(hnd: t_l502_hnd; const dac1, dac2: array of Double;
|
||||
const digout: array of LongWord; size, flags : LongWord;
|
||||
out out_buf: array of LongWord):LongInt; stdcall;
|
||||
begin
|
||||
L502_PrepareData:=_prepare_data(hnd, dac1, dac2, digout, size, flags, out_buf);
|
||||
end;
|
||||
|
||||
function L502_BfLoadFirmware(hnd: t_l502_hnd; filename: string): LongInt; stdcall;
|
||||
begin
|
||||
L502_BfLoadFirmware:=_bf_load_firm(hnd, PAnsiChar(AnsiString(filename)));
|
||||
end;
|
||||
|
||||
function L502_BfMemRead(hnd: t_l502_hnd; addr : LongWord; out regs: array of LongWord;
|
||||
size: LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(regs)) < size) then
|
||||
L502_BfMemRead := L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_BfMemRead:=_bf_mem_read(hnd, addr, regs, size);
|
||||
end;
|
||||
|
||||
function L502_BfMemWrite(hnd: t_l502_hnd; addr : LongWord;
|
||||
const regs: array of LongWord; size: LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(regs)) < size) then
|
||||
L502_BfMemWrite := L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_BfMemWrite:=_bf_mem_write(hnd, addr, regs, size);
|
||||
end;
|
||||
|
||||
function L502_BfExecCmd(hnd: t_l502_hnd; cmd_code : Word; par : LongWord;
|
||||
const snd_data : array of LongWord; snd_size : LongWord;
|
||||
out rcv_data : array of LongWord; rcv_size : LongWord;
|
||||
tout: LongWord; out recvd_size: LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(snd_data)) < snd_size) or
|
||||
(LongWord(Length(rcv_data)) < rcv_size) then
|
||||
L502_BfExecCmd := L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_BfExecCmd:=_bf_exec_cmd(hnd, cmd_code, par, snd_data, snd_size,
|
||||
rcv_data, rcv_size, tout, recvd_size);
|
||||
end;
|
||||
|
||||
function L502_FlashRead(hnd: t_l502_hnd; addr: LongWord;
|
||||
out data: array of Byte; size: LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(data)) < size) then
|
||||
L502_FlashRead := L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_FlashRead:=_bf_mem_write(hnd, addr, data, size);
|
||||
end;
|
||||
///<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Flash-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
function L502_FlashWrite(hnd: t_l502_hnd; addr: LongWord;
|
||||
const data: array of Byte; size: LongWord): LongInt; stdcall;
|
||||
begin
|
||||
if (LongWord(Length(data)) < size) then
|
||||
L502_FlashWrite := L502_ERR_INSUFFICIENT_ARRAY_SIZE
|
||||
else
|
||||
L502_FlashWrite:=_bf_mem_write(hnd, addr, data, size);
|
||||
end;
|
||||
end.
|
||||
|
||||
507
l502/win/l502_spec.c
Normal file
507
l502/win/l502_spec.c
Normal file
@ -0,0 +1,507 @@
|
||||
#include <Windows.h>
|
||||
#include <SetupAPI.h>
|
||||
#include <initguid.h>
|
||||
#include <stddef.h>
|
||||
#include <tchar.h>
|
||||
|
||||
#include "../l502api_private.h"
|
||||
|
||||
#include <winioctl.h>
|
||||
|
||||
|
||||
|
||||
/* GUID интерфейса устройств lpcie для связи приложения с драйвером */
|
||||
DEFINE_GUID (GUID_LPCIE_INTERFACE,
|
||||
0x53869b9a, 0x7875, 0x4fd3, 0x9e, 0x04, 0xbe, 0xc8, 0x1a, 0x92, 0xf9, 0xa9);
|
||||
|
||||
#define L502_IOCTL_TIMEOUT 500
|
||||
|
||||
|
||||
typedef struct {
|
||||
int32_t size;
|
||||
SP_DEVICE_INTERFACE_DETAIL_DATA *intf_detail;
|
||||
} t_lpcie_devlst_intptr;
|
||||
|
||||
|
||||
static int32_t f_ioctl(HANDLE hDevice,
|
||||
uint32_t dwIoControlCode, // control code of operation to perform
|
||||
void* lpInBuffer, // pointer to buffer to supply input data
|
||||
uint32_t nInBufferSize, // size of input buffer in bytes
|
||||
void* lpOutBuffer, // pointer to buffer to receive output data
|
||||
uint32_t nOutBufferSize, // size of output buffer in bytes
|
||||
uint32_t* rx_size,
|
||||
uint32_t TimeOut) { // таймаут в мс
|
||||
uint32_t RealBytesTransferred;
|
||||
uint32_t BytesReturned;
|
||||
OVERLAPPED Ov;
|
||||
int32_t err = X502_ERR_OK;
|
||||
uint32_t syserr = 0;
|
||||
|
||||
|
||||
// инициализируем OVERLAPPED структуру
|
||||
memset(&Ov, 0x0, sizeof(OVERLAPPED));
|
||||
// создаём событие для асинхронного запроса
|
||||
Ov.hEvent = CreateEvent(NULL, FALSE , FALSE, NULL);
|
||||
if(!Ov.hEvent) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
} else {
|
||||
// посылаем требуемый запрос
|
||||
if(!DeviceIoControl( hDevice, dwIoControlCode,
|
||||
lpInBuffer, nInBufferSize,
|
||||
lpOutBuffer, nOutBufferSize,
|
||||
&BytesReturned, &Ov)) {
|
||||
syserr = GetLastError();
|
||||
if(syserr != ERROR_IO_PENDING) {
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_IOCTL_FAILD;
|
||||
GetOverlappedResult(hDevice, &Ov, &RealBytesTransferred, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
// ждём окончания выполнения запроса
|
||||
if (WaitForSingleObject(Ov.hEvent, TimeOut) == WAIT_TIMEOUT) {
|
||||
CancelIo(hDevice);
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_IOCTL_TIMEOUT;
|
||||
GetOverlappedResult(hDevice, &Ov, &RealBytesTransferred, TRUE);
|
||||
}
|
||||
}
|
||||
// попробуем получить кол-во реально переданных байт данных
|
||||
if (err == X502_ERR_OK) {
|
||||
if(!GetOverlappedResult(hDevice, &Ov, &RealBytesTransferred, TRUE)) {
|
||||
syserr = GetLastError();
|
||||
CancelIo(hDevice);
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_IOCTL_FAILD;
|
||||
} else if(nOutBufferSize != RealBytesTransferred) {
|
||||
CancelIo(hDevice);
|
||||
CloseHandle(Ov.hEvent);
|
||||
} else {
|
||||
CloseHandle(Ov.hEvent);
|
||||
}
|
||||
}
|
||||
|
||||
if ((err == X502_ERR_OK) && (rx_size != NULL)) {
|
||||
*rx_size = RealBytesTransferred;
|
||||
}
|
||||
|
||||
if (err==X502_ERR_IOCTL_FAILD) {
|
||||
if (syserr == ERROR_NO_SYSTEM_RESOURCES)
|
||||
err = X502_ERR_INSUFFICIENT_SYSTEM_RESOURCES;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_fpga_reg_write(t_x502_hnd hnd, uint32_t reg, uint32_t val) {
|
||||
t_lpcie_mem_rw mem_wr = {reg,val};
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd),
|
||||
LPCIE_IOCTL_MEMFPGA_WR, &mem_wr, sizeof(mem_wr),
|
||||
NULL, 0, NULL, L502_IOCTL_TIMEOUT) ?
|
||||
X502_ERR_FPGA_REG_READ : 0;
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_fpga_reg_read(t_x502_hnd hnd, uint32_t reg, uint32_t *val) {
|
||||
uint32_t rd_val;
|
||||
int32_t err = f_ioctl (L502_PCI_IFACE_FILE(hnd),
|
||||
LPCIE_IOCTL_MEMFPGA_RD, ®, sizeof(reg),
|
||||
&rd_val, sizeof(rd_val), NULL, L502_IOCTL_TIMEOUT);
|
||||
if (err != X502_ERR_OK) {
|
||||
err = X502_ERR_FPGA_REG_READ;
|
||||
} else if (val != NULL) {
|
||||
*val = rd_val;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_set_params(t_x502_hnd hnd, t_lpcie_stream_ch_params *par) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_SET_PARAMS, par,
|
||||
sizeof(t_lpcie_stream_ch_params), NULL, 0, NULL,
|
||||
L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_start(t_x502_hnd hnd, uint32_t ch, uint32_t single) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), single ? LPCIE_IOCTL_STREAM_START_SINGLE :
|
||||
LPCIE_IOCTL_STREAM_START,
|
||||
&ch, sizeof(ch), NULL, 0, NULL,
|
||||
L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_stop(t_x502_hnd hnd, uint32_t ch, uint32_t flags) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_STOP, &ch, sizeof(ch), NULL, 0, NULL,
|
||||
L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_stream_free(t_x502_hnd hnd, uint32_t ch, uint32_t flags) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_FREE, &ch, sizeof(ch), NULL, 0, NULL,
|
||||
L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_stream_rdy_size(t_x502_hnd hnd, uint32_t ch, uint32_t *rdy_size) {
|
||||
uint32_t rd_val;
|
||||
int32_t err = f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_STREAM_GET_RDY_SIZE, &ch, sizeof(ch),
|
||||
&rd_val, sizeof(rd_val), NULL, L502_IOCTL_TIMEOUT);
|
||||
if ((err == X502_ERR_OK) && (rdy_size != NULL))
|
||||
*rdy_size = rd_val;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int32_t l502_port_cycle_load_start(t_x502_hnd hnd, uint32_t ch, uint32_t size, uint32_t min_irq_step) {
|
||||
t_lpcie_cycle_set_par par;
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
par.size = size;
|
||||
par.irq_step = min_irq_step;
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_LOAD, &par, sizeof(par), NULL, 0,
|
||||
NULL, L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_setup(t_x502_hnd hnd, uint32_t ch, uint32_t evt) {
|
||||
t_lpcie_cycle_evt_par par;
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
par.evt = evt;
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_SWITCH, &par, sizeof(par), NULL, 0,
|
||||
NULL, L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_stop(t_x502_hnd hnd, uint32_t ch, uint32_t evt) {
|
||||
t_lpcie_cycle_evt_par par;
|
||||
memset(&par, 0, sizeof(par));
|
||||
par.ch = ch;
|
||||
par.evt = evt;
|
||||
return f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_STOP, &par, sizeof(par), NULL, 0,
|
||||
NULL, L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_cycle_check_setup(t_x502_hnd hnd, uint32_t ch, uint32_t *done) {
|
||||
uint32_t rd_val;
|
||||
int32_t err = f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_CYCLE_CHECK_SETUP, &ch, sizeof(ch),
|
||||
&rd_val, sizeof(rd_val), NULL, L502_IOCTL_TIMEOUT);
|
||||
if ((err == X502_ERR_OK) && (done != NULL))
|
||||
*done = rd_val;
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_renew_info(t_x502_hnd hnd) {
|
||||
return f_ioctl(L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_RELOAD_DEVINFO, NULL, 0, NULL, 0, NULL,
|
||||
L502_IOCTL_TIMEOUT);
|
||||
}
|
||||
|
||||
int32_t l502_port_get_drv_ver(t_x502_hnd hnd, uint32_t *ver) {
|
||||
uint32_t rd_val;
|
||||
int32_t err = f_ioctl (L502_PCI_IFACE_FILE(hnd), LPCIE_IOCTL_GET_DRV_VERSION, NULL, 0,
|
||||
&rd_val, sizeof(rd_val), NULL, L502_IOCTL_TIMEOUT);
|
||||
if ((err == X502_ERR_OK) && (ver != NULL))
|
||||
*ver = rd_val;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_stream_read(t_x502_hnd hnd, uint32_t* buff, uint32_t size, uint32_t timeout) {
|
||||
int send_size = 4*size;
|
||||
uint32_t NumberOfBytesRead = 0;
|
||||
int32_t err = X502_ERR_OK;
|
||||
OVERLAPPED Ov;
|
||||
|
||||
// инициализируем OVERLAPPED структуру
|
||||
memset(&Ov, 0, sizeof(OVERLAPPED));
|
||||
Ov.hEvent = CreateEvent(NULL, FALSE , FALSE, NULL);
|
||||
if(!Ov.hEvent) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
// посылаем асинхронный запрос на сбор необходимого кол-ва данных
|
||||
if(!ReadFile(L502_PCI_IFACE_FILE(hnd), buff, send_size, NULL, &Ov)) {
|
||||
if(GetLastError() != ERROR_IO_PENDING) {
|
||||
CancelIo(L502_PCI_IFACE_FILE(hnd));
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_RECV;
|
||||
GetOverlappedResult(L502_PCI_IFACE_FILE(hnd), &Ov, &NumberOfBytesRead, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
// ждём окончания выполнения запроса
|
||||
if (err == X502_ERR_OK) {
|
||||
if (WaitForSingleObject(Ov.hEvent, timeout) == WAIT_TIMEOUT) {
|
||||
CancelIo(L502_PCI_IFACE_FILE(hnd));
|
||||
CloseHandle(Ov.hEvent);
|
||||
GetOverlappedResult(L502_PCI_IFACE_FILE(hnd), &Ov, &NumberOfBytesRead, TRUE);
|
||||
} else if(!GetOverlappedResult(L502_PCI_IFACE_FILE(hnd), &Ov, &NumberOfBytesRead, TRUE)) {
|
||||
CancelIo(L502_PCI_IFACE_FILE(hnd));
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_RECV;
|
||||
} else {
|
||||
CloseHandle(Ov.hEvent);
|
||||
}
|
||||
}
|
||||
return err != X502_ERR_OK ? err : NumberOfBytesRead/4;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int32_t l502_port_stream_write(t_x502_hnd hnd, const uint32_t* buff,
|
||||
uint32_t size, uint32_t timeout) {
|
||||
int send_size = 4*size;
|
||||
uint32_t NumberOfBytesRead = 0;
|
||||
int32_t err = X502_ERR_OK;
|
||||
OVERLAPPED Ov;
|
||||
|
||||
// инициализируем OVERLAPPED структуру
|
||||
memset(&Ov, 0, sizeof(OVERLAPPED));
|
||||
Ov.hEvent = CreateEvent(NULL, FALSE , FALSE, NULL);
|
||||
if(!Ov.hEvent) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
if (err == X502_ERR_OK) {
|
||||
// посылаем асинхронный запрос на сбор необходимого кол-ва данных
|
||||
if(!WriteFile(L502_PCI_IFACE_FILE(hnd), buff, send_size, NULL, &Ov)) {
|
||||
if(GetLastError() != ERROR_IO_PENDING) {
|
||||
CancelIo(L502_PCI_IFACE_FILE(hnd));
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_SEND;
|
||||
GetOverlappedResult(L502_PCI_IFACE_FILE(hnd), &Ov, &NumberOfBytesRead, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
// ждём окончания выполнения запроса
|
||||
if (err == X502_ERR_OK) {
|
||||
if (WaitForSingleObject(Ov.hEvent, timeout) == WAIT_TIMEOUT) {
|
||||
CancelIo(L502_PCI_IFACE_FILE(hnd));
|
||||
CloseHandle(Ov.hEvent);
|
||||
GetOverlappedResult(L502_PCI_IFACE_FILE(hnd), &Ov, &NumberOfBytesRead, TRUE);
|
||||
} else if(!GetOverlappedResult(L502_PCI_IFACE_FILE(hnd), &Ov, &NumberOfBytesRead, TRUE)) {
|
||||
CancelIo(L502_PCI_IFACE_FILE(hnd));
|
||||
CloseHandle(Ov.hEvent);
|
||||
err = X502_ERR_SEND;
|
||||
} else {
|
||||
CloseHandle(Ov.hEvent);
|
||||
}
|
||||
}
|
||||
return err != X502_ERR_OK ? err : NumberOfBytesRead/4;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int32_t f_get_file_par(SP_DEVICE_INTERFACE_DETAIL_DATA *detail, TCHAR* filebuf,
|
||||
const TCHAR* file, char* res, uint32_t req_size,
|
||||
uint32_t* read_size) {
|
||||
HANDLE ifile;
|
||||
int32_t err = 0;
|
||||
_tcscpy(filebuf, TEXT(detail->DevicePath));
|
||||
_tcscat(filebuf, file);
|
||||
|
||||
ifile = CreateFile(filebuf, GENERIC_READ,
|
||||
FILE_SHARE_READ,
|
||||
NULL, OPEN_EXISTING,
|
||||
0, NULL);
|
||||
if (ifile != INVALID_HANDLE_VALUE) {
|
||||
DWORD read_cnt=0;
|
||||
if (!ReadFile(ifile, res, req_size, &read_cnt, NULL)) {
|
||||
err = X502_ERR_GET_INFO;
|
||||
} else {
|
||||
if (read_size!=NULL)
|
||||
*read_size = read_cnt;
|
||||
}
|
||||
CloseHandle(ifile);
|
||||
} else {
|
||||
err = X502_ERR_GET_INFO;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int f_fill_devlist(SP_DEVICE_INTERFACE_DETAIL_DATA *detail,
|
||||
t_x502_devrec *info) {
|
||||
int32_t err = X502_ERR_OK;
|
||||
TCHAR *filename = malloc(sizeof(TCHAR)*21 + _tcslen(detail->DevicePath));
|
||||
|
||||
if (filename == NULL) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
} else {
|
||||
err = f_get_file_par(detail, filename, TEXT("\\name"), info->devname,
|
||||
sizeof(info->devname), NULL);
|
||||
if (err == X502_ERR_OK) {
|
||||
/* получаем серийный номер устройства */
|
||||
err = f_get_file_par(detail, filename, TEXT("\\sn"), info->serial,
|
||||
sizeof(info->serial), NULL);
|
||||
}
|
||||
|
||||
/* получаем информацию, открыто ли устройство */
|
||||
if (err == X502_ERR_OK) {
|
||||
char val = '0';
|
||||
f_get_file_par(detail, filename, TEXT("\\opened"), &val, 1, NULL);
|
||||
if (!err && (val!='0'))
|
||||
info->flags |= X502_DEVFLAGS_DEVREC_OPENED;
|
||||
}
|
||||
|
||||
/* получаем информацию, присутствует ли BlackFin */
|
||||
if (err == X502_ERR_OK) {
|
||||
char val = '0';
|
||||
if ((f_get_file_par(detail, filename, TEXT("\\bf"), &val, 1, NULL)==0)
|
||||
&& (val != '0')) {
|
||||
info->flags |= X502_DEVFLAGS_BF_PRESENT;
|
||||
}
|
||||
|
||||
if ((f_get_file_par(detail, filename, TEXT("\\dac"), &val, 1, NULL)==0)
|
||||
&& (val != '0')) {
|
||||
info->flags |= X502_DEVFLAGS_DAC_PRESENT;
|
||||
}
|
||||
|
||||
if ((f_get_file_par(detail, filename, TEXT("\\gal"), &val, 1, NULL)==0)
|
||||
&& (val != '0')) {
|
||||
info->flags |= X502_DEVFLAGS_GAL_PRESENT;
|
||||
}
|
||||
}
|
||||
|
||||
if (err == X502_ERR_OK) {
|
||||
err = l502_devlist_gen(info, detail);
|
||||
}
|
||||
free(filename);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_free_iface_data(void *intptr) {
|
||||
free(intptr);
|
||||
return X502_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
int32_t l502_port_open(t_x502_hnd hnd, const t_x502_devrec *devinfo) {
|
||||
SP_DEVICE_INTERFACE_DETAIL_DATA *detail = (SP_DEVICE_INTERFACE_DETAIL_DATA *)devinfo->internal->iface_data;
|
||||
int32_t err = X502_ERR_OK;
|
||||
HANDLE file = CreateFile(detail->DevicePath, GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL, OPEN_EXISTING,
|
||||
FILE_FLAG_OVERLAPPED, NULL);
|
||||
if (file != INVALID_HANDLE_VALUE) {
|
||||
hnd->iface_data = malloc(sizeof(t_pci_iface_data));
|
||||
if (hnd->iface_data == NULL) {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
CloseHandle(file);
|
||||
} else {
|
||||
L502_PCI_IFACE_FILE(hnd) = file;
|
||||
}
|
||||
} else {
|
||||
DWORD syserr = GetLastError();
|
||||
if (syserr == ERROR_ACCESS_DENIED) {
|
||||
err = X502_ERR_DEVICE_ACCESS_DENIED;
|
||||
} else if (syserr == ERROR_FILE_NOT_FOUND) {
|
||||
err = X502_ERR_DEVICE_NOT_FOUND;
|
||||
} else {
|
||||
err = X502_ERR_DEVICE_OPEN;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
int32_t l502_port_close(t_x502_hnd hnd) {
|
||||
if (hnd->iface_data !=NULL) {
|
||||
CloseHandle(L502_PCI_IFACE_FILE(hnd));
|
||||
free(hnd->iface_data);
|
||||
hnd->iface_data = NULL;
|
||||
}
|
||||
return X502_ERR_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
X502_EXPORT(int32_t) L502_GetDevRecordsList(t_x502_devrec *list, uint32_t size,
|
||||
uint32_t flags, uint32_t *devcnt) {
|
||||
HDEVINFO infoSet;
|
||||
SP_DEVINFO_DATA infoData;
|
||||
DWORD index=0;
|
||||
uint32_t curcnt=0;
|
||||
int32_t err = X502_ERR_OK;
|
||||
|
||||
|
||||
infoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
|
||||
/* получаем список устройств с подержкой интерфейса lpcie */
|
||||
infoSet = SetupDiGetClassDevs(&GUID_LPCIE_INTERFACE,NULL,
|
||||
NULL,
|
||||
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
|
||||
|
||||
/* проходимся по всем устройствам из списка */
|
||||
while (SetupDiEnumDeviceInfo(infoSet, index, &infoData)) {
|
||||
SP_DEVICE_INTERFACE_DATA intfData;
|
||||
intfData.cbSize = sizeof(intfData);
|
||||
/* получаем информацию о интерфейсе */
|
||||
if (SetupDiEnumDeviceInterfaces(infoSet, &infoData, &GUID_LPCIE_INTERFACE,
|
||||
0, &intfData)) {
|
||||
DWORD req_size;
|
||||
/* узнаем резмер детальной информации о интерфейсе (нужна для
|
||||
получения имени устройства) */
|
||||
if (!SetupDiGetDeviceInterfaceDetail(infoSet, &intfData, NULL,
|
||||
0, &req_size, NULL)
|
||||
&& (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
|
||||
SP_DEVICE_INTERFACE_DETAIL_DATA* detail =
|
||||
(SP_DEVICE_INTERFACE_DETAIL_DATA*) malloc(req_size);
|
||||
|
||||
if (detail != NULL) {
|
||||
int detail_used = 0;
|
||||
|
||||
/* пытаемся получить всю информацию */
|
||||
detail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||
|
||||
if (SetupDiGetDeviceInterfaceDetail(infoSet, &intfData,
|
||||
detail, req_size,
|
||||
NULL, NULL)) {
|
||||
t_x502_devrec info;
|
||||
int info_used = 0;
|
||||
detail_used = 1;
|
||||
|
||||
X502_DevRecordInit(&info);
|
||||
|
||||
/* получаем информацию о устройстве из служебных файлов,
|
||||
* предоставляемых драйвером */
|
||||
if (f_fill_devlist(detail, &info) == X502_ERR_OK) {
|
||||
/* если нужны только не открытые, то уже открытое
|
||||
* устройство пропускаем */
|
||||
if (!(flags & X502_GETDEVS_FLAGS_ONLY_NOT_OPENED) ||
|
||||
!(info.flags & X502_DEVFLAGS_DEVREC_OPENED)) {
|
||||
/* если есть место в списке - то сохраняем
|
||||
* полученную информацию */
|
||||
if ((list!=NULL) && (curcnt < size)) {
|
||||
list[curcnt] = info;
|
||||
info_used = 1;
|
||||
}
|
||||
curcnt++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!info_used)
|
||||
X502_FreeDevRecordList(&info,1);
|
||||
}
|
||||
|
||||
if (!detail_used) {
|
||||
free(detail);
|
||||
}
|
||||
} else {
|
||||
err = X502_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
|
||||
if (infoSet != NULL) {
|
||||
SetupDiDestroyDeviceInfoList(infoSet);
|
||||
}
|
||||
|
||||
if (devcnt != NULL)
|
||||
*devcnt = curcnt;
|
||||
|
||||
return err != X502_ERR_OK ? err : curcnt > size ? size : curcnt ;
|
||||
}
|
||||
Reference in New Issue
Block a user