phantom_cmd.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 769 行 · 第 1/3 页
C
769 行
/* mask data that must be retained */
data_read = (unsigned char)(data_read & (unsigned char)(~p_register_map[reg_field_index].p_hw_mask[0]));
data_read |= data_write;
/* clear io error return value */
p_nim->iostatus = 0UL;
/* write byte to hardware */
(*p_nim->SBWrite)(handle, (unsigned char)(p_register_map[reg_field_index].address), data_read, &p_nim->iostatus);
}
break;
case PHANTOM_REGT_MBYTE: /* 1 to 4 byte(s) wide */
{
unsigned char startbit = p_register_map[reg_field_index].start_bit;
signed char bitcnt = p_register_map[reg_field_index].bit_count;
unsigned char mask;
/* Read write the multiple bit (> 8 bits) value */
while (bytes < p_register_map[reg_field_index].bit_count)
{
data_read = (*p_nim->SBRead)(handle, (unsigned char)(p_register_map[reg_field_index].address+offset),
&p_nim->iostatus);
/* Watch for special-case error, read error during write */
if (p_nim->iostatus != 0UL)
{
/* Hardware write error */
PHANTOM_DBG_SET_ERROR(PHANTOM_REG_HDWR_RD_WR_ERR);
return (False);
}
/* mask data that must be retained */
data_read = (unsigned char)(data_read & (unsigned char)(~p_register_map[reg_field_index].p_hw_mask[offset]));
if ((long)value < 0)
{
/* Take the 2's complement. */
value = value + (1UL << bitcnt);
}
bitcnt = (signed char)(bitcnt - (startbit + 1));
if (bitcnt > 0)
{
data_write = (unsigned char)(value >> bitcnt);
mask = p_register_map[reg_field_index].p_hw_mask[offset];
data_write &= p_register_map[reg_field_index].p_hw_mask[offset];
}
else
{
mask = p_register_map[reg_field_index].p_hw_mask[offset];
data_write = (unsigned char)((value << (0 - bitcnt)) & p_register_map[reg_field_index].p_hw_mask[offset]);
}
startbit = 7;
data_read |= data_write;
(*p_nim->SBWrite)(handle, (unsigned char)(p_register_map[reg_field_index].address+offset),
data_read,
&p_nim->iostatus);
/* Watch for special-case error, read error during write */
if (p_nim->iostatus != 0UL)
{
/* Hardware write error */
PHANTOM_DBG_SET_ERROR(PHANTOM_REG_HDWR_RD_WR_ERR);
return (False);
}
offset++;
if (offset == PHANTOM_MAX_REGISTER_LEN)
{
break;
}
bytes += 8;
}
}
break;
case PHANTOM_REG_RESERVED:
default:
break;
}
/* SB Write error */
if (p_nim->iostatus != 0UL)
{
/* write error writing to hardware */
PHANTOM_DBG_SET_ERROR(PHANTOM_IO_WRITERR);
return (False);
}
return (True);
} /* PHANTOM_RegisterWrite */
/*******************************************************************************************************
* Name: PHANTOM_RegisterRead
* Description:
* This function reads from a bit-field or a byte in the special control area. This function is NOT
* applicable for Page0 address space since it is read-only.
* Return Value:
* TRUE - operation successful; FALSE - otherwise.
*
* I/O Parameters Descriptions
* IN PHANTOM_NIM* p_nim Pointer to PHANTOM_NIM structure allocated by application
* IN unsigned short reg_field_index Index that uniquely identifies the value within a register
* or one that spans multiple 8-bit registers beginning form
* the address that corresponds to this reg_field_index.
* IN unsigned long* p_value Value read from the Page0 or Special control address.
* IN PHANTOM_SB_USE_HANDLE use_handle Use specified serial bus handle from the PHANTOM_NIM.
*
*******************************************************************************************************/
BOOL
PHANTOM_RegisterRead(PHANTOM_NIM* p_nim,
unsigned short reg_field_index,
unsigned long* p_value,
PHANTOM_SB_USE_HANDLE use_handle)
{
register int bytes = 0; /* counts 8-bits read */
unsigned char offset = 0;
unsigned char reg_buffer[PHANTOM_MAX_REGISTER_LEN];
unsigned long handle;
const PHANTOM_REGISTER_MAP* p_register_map;
/* Validation */
if (p_nim == 0) /* bad pointer */
{
return (False);
}
if (p_value == 0)
{
return (False);
}
*p_value = 0;
/* Initialization */
switch (use_handle)
{
case PHANTOM_USE_DEMOD_HANDLE:
handle = p_nim->demod_handle;
p_register_map = phantom_register_map;
break;
default:
return (False);
}
/* Verify that index passed points to the correct register record */
PHANTOM_DBG_VALIDATE_REG_IDX(p_register_map, reg_field_index);
/* Register write-only */
PHANTOM_DBG_VALIDATE_REG_WO (p_register_map, reg_field_index);
/* Read the register(s) */
p_nim->iostatus = 0UL; /* clear io error return value */
/* Read the multiple bit (> 8 bits) value */
while (bytes < p_register_map[reg_field_index].bit_count && p_nim->iostatus != 1UL)
{
reg_buffer[offset] = (*p_nim->SBRead)(handle,
(unsigned char)(p_register_map[reg_field_index].address+offset),
&p_nim->iostatus);
if (p_nim->iostatus != 0UL)
{
/* hardware read error */
PHANTOM_DBG_SET_ERROR(PHANTOM_IO_READERR);
return (False);
}
offset++;
if (offset == PHANTOM_MAX_REGISTER_LEN)
{
break;
}
bytes += 8;
}
/* Translate: raw data read from the hardware registers to data used by the driver*/
switch(p_register_map[reg_field_index].reg_type)
{
case PHANTOM_REGT_BIT:
case PHANTOM_REGT_BYTE:
if (p_register_map[reg_field_index].bit_count == 0x01) /* single bit */
{
/* Mask the bit to 1 or 0 */
if ((reg_buffer[0] & p_register_map[reg_field_index].p_hw_mask[0]) != 0)
{
*p_value = 0x01;
}
else
{
*p_value = 0x00;
}
break;
}
else
{
/* Min 2 bits, max 8 bits */
unsigned long temp;
/* mask useful bits from raw, shift rt (make range 0..2^bit_count) */
temp = (long)(reg_buffer[0] & (unsigned char)p_register_map[reg_field_index].p_hw_mask[0]);
temp = (temp >> (p_register_map[reg_field_index].start_bit-(p_register_map[reg_field_index].bit_count-1)));
*p_value = (unsigned char)temp;
break;
}
case PHANTOM_REGT_MBYTE:
{
unsigned short byte_count;
unsigned char bit_value;
unsigned char byte_index;
unsigned char bit_mask;
/* count the number of hardware reg bytes that comprise the register in question */
for (byte_count = 0; byte_count < PHANTOM_MAX_REGISTER_LEN; byte_count++)
{
if (p_register_map[reg_field_index].p_hw_mask[byte_count] == 0x00)
{
break;
}
}
/* Convert multiple byte value from spread bits to compressed */
for (byte_index = 0; byte_index < byte_count; byte_index++)
{
for (bit_mask = 0x80; bit_mask != 0; bit_mask >>= 1)
{
if ((p_register_map[reg_field_index].p_hw_mask[byte_index] & bit_mask) != 0)
{
bit_value = (unsigned char)((bit_mask & reg_buffer[byte_index]) != 0 ? 1UL : 0UL);
*p_value = ((*p_value << 1) | bit_value);
}
}
}
break;
}
default:
PHANTOM_DBG_SET_ERROR(PHANTOM_REG_VERFY_REGDTP_ERR);
return(False);
} /* switch(... */
return (True);
} /* PHANTOM_RegisterRead */
/*******************************************************************************************************/
/* === Low-level DPR Functions ===*/
/*******************************************************************************************************
* Name: PHANTOM_ExecuteLLF
* Description:
* This function executes any DPR LLF command. This function waits for the return response depending
* on the wait for response flag. The error flags and LLF returned values are passed back to the caller.
* This function generates and manages the read/write tokens.
* Return Value:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?