目前配置AD9361的方法使用较多的是纯PL端配置和no_os裸机系统下PS端配置,但是基于Linux配置AD9361的文章不多,我自己在网上学习了一些IIO驱动知识(正点原子关于IIO驱动的视频)以及根据ADI官方提供的资料,做到可以读写AD9361中官方已经封装好的驱动,并且可以实现读写特定寄存器值。命令行的配置方式具体可以参考:AD9361 高性能、高度集成的RF捷变收发™器Linux器件驱动程序 [Analog Devices Wiki]
在开发板的linux系统中,进入sys/bus/iio/devices路径下,可以看到多个iio设备,进入iio:device0中,ls查看目录下的文件,非常多,都是ADI官方已经做好的驱动文件,我们只需要调用就可以实现配置AD9361的一些功能。
例如,使用cat命令,可以查看文件驱动文件的值,使用echo命令可以向驱动文件写入值。
但是上述的驱动文件是配置一些AD9361带宽,速率,模式等等一些功能,如果向对AD9361寄存器直接读写,需要到/sys/kernel/debug/iio中,通过debugfs进行低级寄存器访问direct_reg_access
但是要向从direct_reg_access中读到特定寄存器的值,需要先向其中写入寄存器地址,即先写再读。
如果想向特定寄存器写入一个值,参考下面截图中的命令:
上述均为用命令行去读写IIO驱动,那么在Linux系统下的Vitis中如何编程呢?
首先,要把刚刚我们想要读写的IIO驱动路径加入static char *file_path[]中
/* file_path corresponding to the ad9361 iio framework*/
static char *file_path[] = {
"/sys/bus/iio/devices/iio:device0/calib_mode",
"/sys/bus/iio/devices/iio:device0/calib_mode_available",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_coarse",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_coarse_available",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_fine",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_fine_available",
"/sys/bus/iio/devices/iio:device0/ensm_mode",
"/sys/bus/iio/devices/iio:device0/ensm_mode_available",
"/sys/bus/iio/devices/iio:device0/filter_fir_config",
"/sys/bus/iio/devices/iio:device0/gain_table_config",
"/sys/bus/iio/devices/iio:device0/in_out_voltage_filter_fir_en",
"/sys/bus/iio/devices/iio:device0/in_temp0_input",
"/sys/bus/iio/devices/iio:device0/in_voltage0_gain_control_mode",
"/sys/bus/iio/devices/iio:device0/in_voltage0_hardwaregain",
"/sys/bus/iio/devices/iio:device0/in_voltage0_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/in_voltage0_rf_port_select",
"/sys/bus/iio/devices/iio:device0/in_voltage0_rssi",
"/sys/bus/iio/devices/iio:device0/in_voltage1_gain_control_mode",
"/sys/bus/iio/devices/iio:device0/in_voltage1_hardwaregain",
"/sys/bus/iio/devices/iio:device0/in_voltage1_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/in_voltage1_rf_port_select",
"/sys/bus/iio/devices/iio:device0/in_voltage1_rssi",
"/sys/bus/iio/devices/iio:device0/in_voltage2_offset",
"/sys/bus/iio/devices/iio:device0/in_voltage2_raw",
"/sys/bus/iio/devices/iio:device0/in_voltage2_scale",
"/sys/bus/iio/devices/iio:device0/in_voltage_bb_dc_offset_tracking_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_filter_fir_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_gain_control_mode_available",
"/sys/bus/iio/devices/iio:device0/in_voltage_quadrature_tracking_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_bandwidth",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_bandwidth_available",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_dc_offset_tracking_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_port_select_available",
"/sys/bus/iio/devices/iio:device0/in_voltage_sampling_frequency",
"/sys/bus/iio/devices/iio:device0/in_voltage_sampling_frequency_available",
"/sys/bus/iio/devices/iio:device0/name",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_external",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_load",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_recall",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_save",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_store",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_frequency",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_frequency_available",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_powerdown",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_external",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_load",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_recall",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_save",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_store",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_frequency",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_frequency_available",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_powerdown",
"/sys/bus/iio/devices/iio:device0/out_voltage0_hardwaregain",
"/sys/bus/iio/devices/iio:device0/out_voltage0_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/out_voltage0_rf_port_select",
"/sys/bus/iio/devices/iio:device0/out_voltage0_rssi",
"/sys/bus/iio/devices/iio:device0/out_voltage1_hardwaregain",
"/sys/bus/iio/devices/iio:device0/out_voltage1_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/out_voltage1_rf_port_select",
"/sys/bus/iio/devices/iio:device0/out_voltage1_rssi",
"/sys/bus/iio/devices/iio:device0/out_voltage2_raw",
"/sys/bus/iio/devices/iio:device0/out_voltage2_scale",
"/sys/bus/iio/devices/iio:device0/out_voltage3_raw",
"/sys/bus/iio/devices/iio:device0/out_voltage3_scale",
"/sys/bus/iio/devices/iio:device0/out_voltage_filter_fir_en",
"/sys/bus/iio/devices/iio:device0/out_voltage_rf_bandwidth",
"/sys/bus/iio/devices/iio:device0/out_voltage_rf_bandwidth_available",
"/sys/bus/iio/devices/iio:device0/out_voltage_rf_port_select_available",
"/sys/bus/iio/devices/iio:device0/out_voltage_sampling_frequency",
"/sys/bus/iio/devices/iio:device0/out_voltage_sampling_frequency_available",
"/sys/bus/iio/devices/iio:device0/rssi_gain_step_error",
"/sys/bus/iio/devices/iio:device0/rx_path_rates",
"/sys/bus/iio/devices/iio:device0/trx_rate_governor",
"/sys/bus/iio/devices/iio:device0/trx_rate_governor_available",
"/sys/bus/iio/devices/iio:device0/tx_path_rates",
"/sys/bus/iio/devices/iio:device0/xo_correction",
"/sys/bus/iio/devices/iio:device0/xo_correction_available",
"/sys/kernel/debug/iio/iio:device0/direct_reg_access"
};
然后,创建相应的path_index,path_index内容需要和ile_path[]中的路径按顺序一一对应。
/* file_path index,the file_path must correspond to the order of files in the file_path */
enum path_index {
CALIB_MODE,
CALIB_MODE_AVAILABLE,
DCXO_TUNE_COARSE,
DCXO_TUNE_COARSE_AVAILABLE,
DCXO_TUNE_FINE,
DCXO_TUNE_FINE_AVAILABLE,
ENSM_MODE,
ENSM_MODE_AVAILABLE,
FILTER_FIR_CONFIG,
GAIN_TABLE_CONFIG,
IN_OUT_VOLTAGE_FILTER_FIR_EN,
IN_TEMP0_INPUT,
IN_VOLTAGE0_GAIN_CONTROL_MODE,
IN_VOLTAGE0_HARDWAREGAIN,
IN_VOLTAGE0_HARDWAREGAIN_AVAILABLE,
IN_VOLTAGE0_RF_PORT_SELECT,
IN_VOLTAGE0_RSSI,
IN_VOLTAGE1_GAIN_CONTROL_MODE,
IN_VOLTAGE1_HARDWAREGAIN,
IN_VOLTAGE1_HARDWAREGAIN_AVAILABLE,
IN_VOLTAGE1_RF_PORT_SELECT,
IN_VOLTAGE1_RSSI,
IN_VOLTAGE2_OFFSET,
IN_VOLTAGE2_RAW,
IN_VOLTAGE2_SCALE,
IN_VOLTAGE_BB_DC_OFFSET_TRACKING_EN,
IN_VOLTAGE_FILTER_FIR_EN,
IN_VOLTAGE_GAIN_CONTROL_MODE_AVAILABLE,
IN_VOLTAGE_QUADRATURE_TRACKING_EN,
IN_VOLTAGE_RF_BANDWIDTH,
IN_VOLTAGE_RF_BANDWIDTH_AVAILABLE,
IN_VOLTAGE_RF_DC_OFFSET_TRACKING_EN,
IN_VOLTAGE_RF_PORT_SELECT_AVAILABLE,
IN_VOLTAGE_SAMPLING_FREQUENCY,
IN_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE,
NAME,
OUT_ALTVOLTAGE0_RX_LO_EXTERNAL,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_LOAD,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_RECALL,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_SAVE,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_STORE,
OUT_ALTVOLTAGE0_RX_LO_FREQUENCY,
OUT_ALTVOLTAGE0_RX_LO_FREQUENCY_AVAILABLE,
OUT_ALTVOLTAGE0_RX_LO_POWERDOWN,
OUT_ALTVOLTAGE1_TX_LO_EXTERNAL,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_LOAD,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_RECALL,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_SAVE,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_STORE,
OUT_ALTVOLTAGE1_TX_LO_FREQUENCY,
OUT_ALTVOLTAGE1_TX_LO_FREQUENCY_AVAILABLE,
OUT_ALTVOLTAGE1_TX_LO_POWERDOWN,
OUT_VOLTAGE0_HARDWAREGAIN,
OUT_VOLTAGE0_HARDWAREGAIN_AVAILABLE,
OUT_VOLTAGE0_RF_PORT_SELECT,
OUT_VOLTAGE0_RSSI,
OUT_VOLTAGE1_HARDWAREGAIN,
OUT_VOLTAGE1_HARDWAREGAIN_AVAILABLE,
OUT_VOLTAGE1_RF_PORT_SELECT,
OUT_VOLTAGE1_RSSI,
OUT_VOLTAGE2_RAW,
OUT_VOLTAGE2_SCALE,
OUT_VOLTAGE3_RAW,
OUT_VOLTAGE3_SCALE,
OUT_VOLTAGE_FILTER_FIR_EN,
OUT_VOLTAGE_RF_BANDWIDTH,
OUT_VOLTAGE_RF_BANDWIDTH_AVAILABLE,
OUT_VOLTAGE_RF_PORT_SELECT_AVAILABLE,
OUT_VOLTAGE_SAMPLING_FREQUENCY,
OUT_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE,
RSSI_GAIN_STEP_ERROR,
RX_PATH_RATES,
TRX_RATE_GOVERNOR,
TRX_RATE_GOVERNOR_AVAILABLE,
TX_PATH_RATES,
XO_CORRECTION,
XO_CORRECTION_AVAILABLE,
DIRECT_REG_ACCESS,
};
然后向ad9361设备中添加成员
/* ad9361 data device struct member*/
struct ad9361_rf_phy {
char *calib_mode;//Pointer to a string (dynamic memory allocation)
char *calib_mode_available;
int *dcxo_tune_coarse;//cat: dcxo_tune_coarse: No such device
char *dcxo_tune_coarse_available;
int *dcxo_tune_fine;//cat: dcxo_tune_fine: No such device
char *dcxo_tune_fine_available;
char *ensm_mode;
char *ensm_mode_available;
char *filter_fir_config;
char *gain_table_config;
int *in_out_voltage_filter_fir_en;
int *in_temp0_input;
char *in_voltage0_gain_control_mode;
char *in_voltage0_hardwaregain;
char *in_voltage0_hardwaregain_available;
char *in_voltage0_rf_port_select;
char *in_voltage0_rssi;
char *in_voltage1_gain_control_mode;
char *in_voltage1_hardwaregain;
char *in_voltage1_hardwaregain_available;
char *in_voltage1_rf_port_select;
char *in_voltage1_rssi;
int *in_voltage2_offset;
int *in_voltage2_raw;
double in_voltage2_scale;
int *in_voltage_bb_dc_offset_tracking_en;
int *in_voltage_filter_fir_en;
char *in_voltage_gain_control_mode_available;
int *in_voltage_quadrature_tracking_en;
int *in_voltage_rf_bandwidth;
char *in_voltage_rf_bandwidth_available;
int *in_voltage_rf_dc_offset_tracking_en;
char *in_voltage_rf_port_select_available;
int *in_voltage_sampling_frequency;
char *in_voltage_sampling_frequency_available;
char *name;
int *out_altvoltage0_RX_LO_external;
int *out_altvoltage0_RX_LO_fastlock_load;
int *out_altvoltage0_RX_LO_fastlock_recall;//cat: out_altvoltage0_RX_LO_fastlock_recall: Invalid argument
char *out_altvoltage0_RX_LO_fastlock_save;
int *out_altvoltage0_RX_LO_fastlock_store;
char *out_altvoltage0_RX_LO_frequency;
char *out_altvoltage0_RX_LO_frequency_available;
int *out_altvoltage0_RX_LO_powerdown;
int *out_altvoltage1_TX_LO_external;
int *out_altvoltage1_TX_LO_fastlock_load;
int *out_altvoltage1_TX_LO_fastlock_recall;
char *out_altvoltage1_TX_LO_fastlock_save;
int *out_altvoltage1_TX_LO_fastlock_store;
char *out_altvoltage1_TX_LO_frequency;
char *out_altvoltage1_TX_LO_frequency_available;
int *out_altvoltage1_TX_LO_powerdown;
char *out_voltage0_hardwaregain;
char *out_voltage0_hardwaregain_available;
char *out_voltage0_rf_port_select;
char *out_voltage0_rssi;
char *out_voltage1_hardwaregain;
char *out_voltage1_hardwaregain_available;
char *out_voltage1_rf_port_select;
char *out_voltage1_rssi;
int *out_voltage2_raw;
double out_voltage2_scale;
int *out_voltage3_raw;
double out_voltage3_scale;
int *out_voltage_filter_fir_en;
int *out_voltage_rf_bandwidth;
char *out_voltage_rf_bandwidth_available;
char *out_voltage_rf_port_select_available;
int *out_voltage_sampling_frequency;
char *out_voltage_sampling_frequency_available;
char *rssi_gain_step_error;
char *rx_path_rates;
char *trx_rate_governor;
char *trx_rate_governor_available;
char *tx_path_rates;
int *xo_correction;
char *xo_correction_available;
char *direct_reg_access;
};
struct ad9361_rf_phy ad9361;
然后对数据流文件读写,因为从文件中读出来的都是字符串,所以有时候会涉及到字符串和整型数据的转化。
读函数有:
/*
* @description : read the specified file
* @param - filename : the path of the file which will be read
* @param - str : the read of file string
* @return : 0:success; other: failure
*/
static int file_data_read(char *filename, char *str)//only read a char data
{
int ret = 0;
FILE *data_stream;
data_stream = fopen(filename, "r"); /* read only open */
if(data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
ret = fscanf(data_stream, "%s", str);
if(!ret) {
printf("file read error!\r\n");
} else if(ret == EOF) {
/* Readjust the file pointer to the file header when you reach the end of the file */
fseek(data_stream, 0, SEEK_SET);
}
fclose(data_stream); /* close file */
return 0;
}
//read a string data, the read size is max_size
static int file_data_read_string(char *filename, char *str, size_t max_size)
{
FILE *data_stream;
data_stream = fopen(filename, "r");
if(data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
// Reset str to an empty string
str[0] = '\0';
char line[256]; // Adjust the size as needed
// Read lines until the end of the file
while (fgets(line, sizeof(line), data_stream) != NULL) {
// Concatenate the line to the existing content
strncat(str, line, max_size - strlen(str) - 1);
// Check if the entire line was read
if (str[strlen(str) - 1] == '\n') {
break;
}
}
fclose(data_stream); // Close the file
return 0;
}
#define SENSOR_INT_DATA_SET_TWO(ret, index, reg_addr, data, member)\
dev->member = data;\
ret = file_data_write_two(file_path[index], reg_addr, data);\
/*
* @description : get ad9361 data
* @param - dev : device struct
* @return : 0:success; other: failure
**/
static int sensor_read(struct ad9361_rf_phy *dev)
{
int ret = 0;
char str[MAX_BUFFER_SIZE];
/* get iio sysfs data */
file_data_read_string(file_path[CALIB_MODE], str,MAX_BUFFER_SIZE);
dev->calib_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[CALIB_MODE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->calib_mode_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, DCXO_TUNE_COARSE, str, dcxo_tune_coarse);
file_data_read_string(file_path[DCXO_TUNE_COARSE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->dcxo_tune_coarse_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, DCXO_TUNE_FINE, str, dcxo_tune_fine);
file_data_read_string(file_path[DCXO_TUNE_FINE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->dcxo_tune_fine_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[ENSM_MODE], str,MAX_BUFFER_SIZE);
dev->ensm_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[ENSM_MODE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->ensm_mode_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[FILTER_FIR_CONFIG], str,MAX_BUFFER_SIZE);
dev->filter_fir_config = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[GAIN_TABLE_CONFIG], str,MAX_BUFFER_SIZE);
dev->gain_table_config = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_OUT_VOLTAGE_FILTER_FIR_EN, str, in_out_voltage_filter_fir_en);
SENSOR_INT_DATA_GET(ret, IN_TEMP0_INPUT, str, in_temp0_input);
file_data_read_string(file_path[IN_VOLTAGE0_GAIN_CONTROL_MODE],str,MAX_BUFFER_SIZE);
dev->in_voltage0_gain_control_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->in_voltage0_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage0_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_RF_PORT_SELECT],str,MAX_BUFFER_SIZE);
dev->in_voltage0_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_RSSI], str,MAX_BUFFER_SIZE);
dev->in_voltage0_rssi = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_GAIN_CONTROL_MODE],str,MAX_BUFFER_SIZE);
dev->in_voltage1_gain_control_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->in_voltage1_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage1_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_RF_PORT_SELECT], str,MAX_BUFFER_SIZE);
dev->in_voltage1_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_RSSI], str,MAX_BUFFER_SIZE);
dev->in_voltage1_rssi = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE2_OFFSET, str, in_voltage2_offset);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE2_RAW, str, in_voltage2_raw);
SENSOR_FLOAT_DATA_GET(ret, IN_VOLTAGE2_SCALE, str, in_voltage2_scale);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_BB_DC_OFFSET_TRACKING_EN, str, in_voltage_bb_dc_offset_tracking_en);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_FILTER_FIR_EN, str, in_voltage_filter_fir_en);
file_data_read_string(file_path[IN_VOLTAGE_GAIN_CONTROL_MODE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_gain_control_mode_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_QUADRATURE_TRACKING_EN, str, in_voltage_quadrature_tracking_en);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_RF_BANDWIDTH, str, in_voltage_rf_bandwidth);
file_data_read_string(file_path[IN_VOLTAGE_RF_BANDWIDTH_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_rf_bandwidth_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_RF_DC_OFFSET_TRACKING_EN, str, in_voltage_rf_dc_offset_tracking_en);
file_data_read_string(file_path[IN_VOLTAGE_RF_PORT_SELECT_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_rf_port_select_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_SAMPLING_FREQUENCY, str, in_voltage_sampling_frequency);
file_data_read_string(file_path[IN_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_sampling_frequency_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[NAME], str,MAX_BUFFER_SIZE);
dev->name = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_EXTERNAL, str, out_altvoltage0_RX_LO_external);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_LOAD, str, out_altvoltage0_RX_LO_fastlock_load);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_RECALL, str, out_altvoltage0_RX_LO_fastlock_recall);//cat: out_altvoltage0_RX_LO_fastlock_recall: Invalid argument
file_data_read_string(file_path[OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_SAVE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage0_RX_LO_fastlock_save = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_STORE, str, out_altvoltage0_RX_LO_fastlock_store);
file_data_read_string(file_path[OUT_ALTVOLTAGE0_RX_LO_FREQUENCY], str,MAX_BUFFER_SIZE);
dev->out_altvoltage0_RX_LO_frequency = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_ALTVOLTAGE0_RX_LO_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage0_RX_LO_frequency_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_POWERDOWN, str, out_altvoltage0_RX_LO_powerdown);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_EXTERNAL, str, out_altvoltage1_TX_LO_external);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_LOAD, str, out_altvoltage1_TX_LO_fastlock_load);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_RECALL, str, out_altvoltage1_TX_LO_fastlock_recall);//cat: out_altvoltage1_TX_LO_fastlock_recall: Invalid argument
file_data_read_string(file_path[OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_SAVE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage1_TX_LO_fastlock_save = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_STORE, str, out_altvoltage1_TX_LO_fastlock_store);
file_data_read_string(file_path[OUT_ALTVOLTAGE1_TX_LO_FREQUENCY], str,MAX_BUFFER_SIZE);
dev->out_altvoltage1_TX_LO_frequency = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_ALTVOLTAGE1_TX_LO_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage1_TX_LO_frequency_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_POWERDOWN, str, out_altvoltage1_TX_LO_powerdown);
file_data_read_string(file_path[OUT_VOLTAGE0_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->out_voltage0_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE0_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage0_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE0_RF_PORT_SELECT], str,MAX_BUFFER_SIZE);
dev->out_voltage0_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE0_RSSI], str,MAX_BUFFER_SIZE);
dev->out_voltage0_rssi = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->out_voltage1_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage1_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_RF_PORT_SELECT], str,MAX_BUFFER_SIZE);
dev->out_voltage1_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_RSSI], str,MAX_BUFFER_SIZE);
dev->out_voltage1_rssi = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE2_RAW, str, out_voltage2_raw);
SENSOR_FLOAT_DATA_GET(ret, OUT_VOLTAGE2_SCALE, str, out_voltage2_scale);
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE3_RAW, str, out_voltage3_raw);
SENSOR_FLOAT_DATA_GET(ret, OUT_VOLTAGE3_SCALE, str, out_voltage3_scale);
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE_FILTER_FIR_EN, str, out_voltage_filter_fir_en);
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE_RF_BANDWIDTH, str, out_voltage_rf_bandwidth);
file_data_read_string(file_path[OUT_VOLTAGE_RF_BANDWIDTH_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage_rf_bandwidth_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE_RF_PORT_SELECT_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage_rf_port_select_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE_SAMPLING_FREQUENCY, str, out_voltage_sampling_frequency);
file_data_read_string(file_path[OUT_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage_sampling_frequency_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[RSSI_GAIN_STEP_ERROR], str,MAX_BUFFER_SIZE);
dev->rssi_gain_step_error = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[RX_PATH_RATES], str,MAX_BUFFER_SIZE);
dev->rx_path_rates = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[TRX_RATE_GOVERNOR], str,MAX_BUFFER_SIZE);
dev->trx_rate_governor = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[TRX_RATE_GOVERNOR_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->trx_rate_governor_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[TX_PATH_RATES], str,MAX_BUFFER_SIZE);
dev->tx_path_rates = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, XO_CORRECTION, str, xo_correction);
file_data_read_string(file_path[XO_CORRECTION_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->xo_correction_available = strdup(str);// Allocate memory for a copy of the string
// SENSOR_INT_DATA_GET(ret, DIRECT_REG_ACCESS, str, direct_reg_access);
file_data_read_string(file_path[DIRECT_REG_ACCESS], str,MAX_BUFFER_SIZE);
dev->direct_reg_access = strdup(str);// Allocate memory for a copy of the string
return ret;
}
/*
* @description : read ad9361 reg
* @param - dev : device struct
* @return : 0:success; other: failure
**/
static int sensor_read_reg(struct ad9361_rf_phy *dev, int reg_addr)
{
int ret = 0;
char str[MAX_BUFFER_SIZE];
SENSOR_INT_DATA_SET(ret, DIRECT_REG_ACCESS, reg_addr, direct_reg_access);
file_data_read_string(file_path[DIRECT_REG_ACCESS], str,MAX_BUFFER_SIZE);
dev->direct_reg_access = strdup(str);// Allocate memory for a copy of the string
printf("0x%x,%s\r\n",reg_addr,ad9361.direct_reg_access);
return ret;
}
写函数有:
/*
* @description : write the specified file
* @param - filename : the path of the file which will be read
* @param - data : the int value you will write to the file
* @return : 0:success; other: failure
*/
static int file_data_write(char *filename, int *data)
{
int ret = 0;
FILE *data_stream;
char str[20];
snprintf(str,sizeof(str), "%d", data);//turn integer to string
data_stream = fopen(filename, "w"); /* write only open */
if(data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
fprintf(data_stream,"%s",str);
fclose(data_stream); /* close file */
return 0;
}
/*
* @description : write the specified file
* @param - filename : the path of the file which will be read
* @param - reg_addr : the address you will write to the file
* @param - data : the data int value you will write to the file
* @return : 0: success; other: failure
*/
static int file_data_write_two(char *filename, int reg_addr, int data)
{
int ret = 0;
FILE *data_stream;
char str[40]; // Increased buffer size to accommodate two integers
snprintf(str, sizeof(str), "%d %d", reg_addr, data); // Concatenate two integers as a string
data_stream = fopen(filename, "w"); /* write only open */
if (data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
fprintf(data_stream, "%s", str);
fclose(data_stream); /* close file */
return 0;
}
#define SENSOR_INT_DATA_SET(ret, index, data, member)\
dev->member = data;\
ret = file_data_write(file_path[index], data);\
#define SENSOR_INT_DATA_SET_TWO(ret, index, reg_addr, data, member)\
dev->member = data;\
ret = file_data_write_two(file_path[index], reg_addr, data);\
/*
* @description : write ad9361 reg
* @param - dev : device struct
* @return : 0:success; other: failure
**/
static int sensor_write_reg(struct ad9361_rf_phy *dev, int reg_addr, int data)
{
int ret = 0;
char str[MAX_BUFFER_SIZE];
SENSOR_INT_DATA_SET_TWO(ret, DIRECT_REG_ACCESS, reg_addr, data,direct_reg_access);
file_data_read_string(file_path[DIRECT_REG_ACCESS], str,MAX_BUFFER_SIZE);
dev->direct_reg_access = strdup(str);// Allocate memory for a copy of the string
printf("0x%x,0x%x,%s\r\n",reg_addr,data,ad9361.direct_reg_access);
return ret;
}
字符串转int和float
/* User add*/
double atof( const char* s ) {
return strtod( s, ( char** )NULL );
}
int atoi( const char* s ) {
int v = 0;
int sign = 0;
while ( ( *s == ' ' ) || ( ( int )( *s - 9 ) < 5u ) ) {
++s;
}
switch ( *s ) {
case '-' : sign = -1;break;
case '+' : ++s;break;
}
while ( ( unsigned int )( *s - '0' ) < 10u ) {
v = v * 10 + *s - '0';
++s;
}
return sign ? -v : v;
}
完整main.c代码:
/*
assign WData1[31:0] = slv_reg0[31:0];
assign WData2[31:0] = slv_reg1[31:0];
assign WComm[7:0] = slv_reg2[7:0];
assign CSW_n = slv_reg2[8];
assign CSR_n = slv_reg2[9];
*/
#include "xparameters.h"
#include <asm-generic/param.h>
#include "ps_pl.h"
#include <stdint.h>ad9361_bbdc_offs_enable_raw
#include <stdio.h> /*\u6807\u51c6\u8f93\u5165\u8f93\u51fa\u5b9a\u4e49*/
#include <stdlib.h> /*\u6807\u51c6\u51fd\u6570\u5e93\u5b9a\u4e49*/
#include <unistd.h> /*Unix\u6807\u51c6\u51fd\u6570\u5b9a\u4e49*/
#include <sys/types.h> /**/
#include <sys/stat.h> /**/
#include <fcntl.h> /*\u6587\u4ef6\u63a7\u5236\u5b9a\u4e49*/
#include <termios.h> /*PPSIX\u7ec8\u7aef\u63a7\u5236\u5b9a\u4e49*/
#include <errno.h> /*\u9519\u8bef\u53f7\u5b9a\u4e49*/
#include <sys/time.h>
#include <string.h>
#include <getopt.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <linux/input.h>
#include <linux/spi/spidev.h>
#include <asm-generic/ioctl.h>
#include <sys/mman.h>
#include <linux/module.h>
//#include <sys/ioctl.h>
#include <strings.h>
#include <signal.h>
#include <pthread.h>
#include <poll.h>
#include "board.h"
/* user add */
#include <sys/select.h>
#include <signal.h>
#include <linux/iio/iio.h>
#include <linux/iio/iio-debug.h>
#include <linux/iio/types.h>
#include <inttypes.h>
/* User add*/
double atof( const char* s ) {
return strtod( s, ( char** )NULL );
}
int atoi( const char* s ) {
int v = 0;
int sign = 0;
while ( ( *s == ' ' ) || ( ( int )( *s - 9 ) < 5u ) ) {
++s;
}
switch ( *s ) {
case '-' : sign = -1;break;
case '+' : ++s;break;
}
while ( ( unsigned int )( *s - '0' ) < 10u ) {
v = v * 10 + *s - '0';
++s;
}
return sign ? -v : v;
}
/* string to number,converting an float string to an float value */
#define SENSOR_FLOAT_DATA_GET(ret, index, str, member)\
ret = file_data_read(file_path[index], str);\
dev->member = atof(str);\
/* string to number,converting an integer string to an integer value */
#define SENSOR_INT_DATA_GET(ret, index, str, member)\
ret = file_data_read(file_path[index], str);\
dev->member = atoi(str);\
/* file_path corresponding to the ad9361 iio framework*/
static char *file_path[] = {
"/sys/bus/iio/devices/iio:device0/calib_mode",
"/sys/bus/iio/devices/iio:device0/calib_mode_available",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_coarse",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_coarse_available",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_fine",
"/sys/bus/iio/devices/iio:device0/dcxo_tune_fine_available",
"/sys/bus/iio/devices/iio:device0/ensm_mode",
"/sys/bus/iio/devices/iio:device0/ensm_mode_available",
"/sys/bus/iio/devices/iio:device0/filter_fir_config",
"/sys/bus/iio/devices/iio:device0/gain_table_config",
"/sys/bus/iio/devices/iio:device0/in_out_voltage_filter_fir_en",
"/sys/bus/iio/devices/iio:device0/in_temp0_input",
"/sys/bus/iio/devices/iio:device0/in_voltage0_gain_control_mode",
"/sys/bus/iio/devices/iio:device0/in_voltage0_hardwaregain",
"/sys/bus/iio/devices/iio:device0/in_voltage0_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/in_voltage0_rf_port_select",
"/sys/bus/iio/devices/iio:device0/in_voltage0_rssi",
"/sys/bus/iio/devices/iio:device0/in_voltage1_gain_control_mode",
"/sys/bus/iio/devices/iio:device0/in_voltage1_hardwaregain",
"/sys/bus/iio/devices/iio:device0/in_voltage1_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/in_voltage1_rf_port_select",
"/sys/bus/iio/devices/iio:device0/in_voltage1_rssi",
"/sys/bus/iio/devices/iio:device0/in_voltage2_offset",
"/sys/bus/iio/devices/iio:device0/in_voltage2_raw",
"/sys/bus/iio/devices/iio:device0/in_voltage2_scale",
"/sys/bus/iio/devices/iio:device0/in_voltage_bb_dc_offset_tracking_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_filter_fir_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_gain_control_mode_available",
"/sys/bus/iio/devices/iio:device0/in_voltage_quadrature_tracking_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_bandwidth",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_bandwidth_available",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_dc_offset_tracking_en",
"/sys/bus/iio/devices/iio:device0/in_voltage_rf_port_select_available",
"/sys/bus/iio/devices/iio:device0/in_voltage_sampling_frequency",
"/sys/bus/iio/devices/iio:device0/in_voltage_sampling_frequency_available",
"/sys/bus/iio/devices/iio:device0/name",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_external",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_load",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_recall",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_save",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_fastlock_store",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_frequency",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_frequency_available",
"/sys/bus/iio/devices/iio:device0/out_altvoltage0_RX_LO_powerdown",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_external",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_load",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_recall",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_save",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_fastlock_store",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_frequency",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_frequency_available",
"/sys/bus/iio/devices/iio:device0/out_altvoltage1_TX_LO_powerdown",
"/sys/bus/iio/devices/iio:device0/out_voltage0_hardwaregain",
"/sys/bus/iio/devices/iio:device0/out_voltage0_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/out_voltage0_rf_port_select",
"/sys/bus/iio/devices/iio:device0/out_voltage0_rssi",
"/sys/bus/iio/devices/iio:device0/out_voltage1_hardwaregain",
"/sys/bus/iio/devices/iio:device0/out_voltage1_hardwaregain_available",
"/sys/bus/iio/devices/iio:device0/out_voltage1_rf_port_select",
"/sys/bus/iio/devices/iio:device0/out_voltage1_rssi",
"/sys/bus/iio/devices/iio:device0/out_voltage2_raw",
"/sys/bus/iio/devices/iio:device0/out_voltage2_scale",
"/sys/bus/iio/devices/iio:device0/out_voltage3_raw",
"/sys/bus/iio/devices/iio:device0/out_voltage3_scale",
"/sys/bus/iio/devices/iio:device0/out_voltage_filter_fir_en",
"/sys/bus/iio/devices/iio:device0/out_voltage_rf_bandwidth",
"/sys/bus/iio/devices/iio:device0/out_voltage_rf_bandwidth_available",
"/sys/bus/iio/devices/iio:device0/out_voltage_rf_port_select_available",
"/sys/bus/iio/devices/iio:device0/out_voltage_sampling_frequency",
"/sys/bus/iio/devices/iio:device0/out_voltage_sampling_frequency_available",
"/sys/bus/iio/devices/iio:device0/rssi_gain_step_error",
"/sys/bus/iio/devices/iio:device0/rx_path_rates",
"/sys/bus/iio/devices/iio:device0/trx_rate_governor",
"/sys/bus/iio/devices/iio:device0/trx_rate_governor_available",
"/sys/bus/iio/devices/iio:device0/tx_path_rates",
"/sys/bus/iio/devices/iio:device0/xo_correction",
"/sys/bus/iio/devices/iio:device0/xo_correction_available",
"/sys/kernel/debug/iio/iio:device0/direct_reg_access"
};
/* file_path index,the file_path must correspond to the order of files in the file_path */
enum path_index {
CALIB_MODE,
CALIB_MODE_AVAILABLE,
DCXO_TUNE_COARSE,
DCXO_TUNE_COARSE_AVAILABLE,
DCXO_TUNE_FINE,
DCXO_TUNE_FINE_AVAILABLE,
ENSM_MODE,
ENSM_MODE_AVAILABLE,
FILTER_FIR_CONFIG,
GAIN_TABLE_CONFIG,
IN_OUT_VOLTAGE_FILTER_FIR_EN,
IN_TEMP0_INPUT,
IN_VOLTAGE0_GAIN_CONTROL_MODE,
IN_VOLTAGE0_HARDWAREGAIN,
IN_VOLTAGE0_HARDWAREGAIN_AVAILABLE,
IN_VOLTAGE0_RF_PORT_SELECT,
IN_VOLTAGE0_RSSI,
IN_VOLTAGE1_GAIN_CONTROL_MODE,
IN_VOLTAGE1_HARDWAREGAIN,
IN_VOLTAGE1_HARDWAREGAIN_AVAILABLE,
IN_VOLTAGE1_RF_PORT_SELECT,
IN_VOLTAGE1_RSSI,
IN_VOLTAGE2_OFFSET,
IN_VOLTAGE2_RAW,
IN_VOLTAGE2_SCALE,
IN_VOLTAGE_BB_DC_OFFSET_TRACKING_EN,
IN_VOLTAGE_FILTER_FIR_EN,
IN_VOLTAGE_GAIN_CONTROL_MODE_AVAILABLE,
IN_VOLTAGE_QUADRATURE_TRACKING_EN,
IN_VOLTAGE_RF_BANDWIDTH,
IN_VOLTAGE_RF_BANDWIDTH_AVAILABLE,
IN_VOLTAGE_RF_DC_OFFSET_TRACKING_EN,
IN_VOLTAGE_RF_PORT_SELECT_AVAILABLE,
IN_VOLTAGE_SAMPLING_FREQUENCY,
IN_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE,
NAME,
OUT_ALTVOLTAGE0_RX_LO_EXTERNAL,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_LOAD,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_RECALL,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_SAVE,
OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_STORE,
OUT_ALTVOLTAGE0_RX_LO_FREQUENCY,
OUT_ALTVOLTAGE0_RX_LO_FREQUENCY_AVAILABLE,
OUT_ALTVOLTAGE0_RX_LO_POWERDOWN,
OUT_ALTVOLTAGE1_TX_LO_EXTERNAL,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_LOAD,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_RECALL,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_SAVE,
OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_STORE,
OUT_ALTVOLTAGE1_TX_LO_FREQUENCY,
OUT_ALTVOLTAGE1_TX_LO_FREQUENCY_AVAILABLE,
OUT_ALTVOLTAGE1_TX_LO_POWERDOWN,
OUT_VOLTAGE0_HARDWAREGAIN,
OUT_VOLTAGE0_HARDWAREGAIN_AVAILABLE,
OUT_VOLTAGE0_RF_PORT_SELECT,
OUT_VOLTAGE0_RSSI,
OUT_VOLTAGE1_HARDWAREGAIN,
OUT_VOLTAGE1_HARDWAREGAIN_AVAILABLE,
OUT_VOLTAGE1_RF_PORT_SELECT,
OUT_VOLTAGE1_RSSI,
OUT_VOLTAGE2_RAW,
OUT_VOLTAGE2_SCALE,
OUT_VOLTAGE3_RAW,
OUT_VOLTAGE3_SCALE,
OUT_VOLTAGE_FILTER_FIR_EN,
OUT_VOLTAGE_RF_BANDWIDTH,
OUT_VOLTAGE_RF_BANDWIDTH_AVAILABLE,
OUT_VOLTAGE_RF_PORT_SELECT_AVAILABLE,
OUT_VOLTAGE_SAMPLING_FREQUENCY,
OUT_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE,
RSSI_GAIN_STEP_ERROR,
RX_PATH_RATES,
TRX_RATE_GOVERNOR,
TRX_RATE_GOVERNOR_AVAILABLE,
TX_PATH_RATES,
XO_CORRECTION,
XO_CORRECTION_AVAILABLE,
DIRECT_REG_ACCESS,
};
/* ad9361 data device struct member*/
struct ad9361_rf_phy {
char *calib_mode;//Pointer to a string (dynamic memory allocation)
char *calib_mode_available;
int *dcxo_tune_coarse;//cat: dcxo_tune_coarse: No such device
char *dcxo_tune_coarse_available;
int *dcxo_tune_fine;//cat: dcxo_tune_fine: No such device
char *dcxo_tune_fine_available;
char *ensm_mode;
char *ensm_mode_available;
char *filter_fir_config;
char *gain_table_config;
int *in_out_voltage_filter_fir_en;
int *in_temp0_input;
char *in_voltage0_gain_control_mode;
char *in_voltage0_hardwaregain;
char *in_voltage0_hardwaregain_available;
char *in_voltage0_rf_port_select;
char *in_voltage0_rssi;
char *in_voltage1_gain_control_mode;
char *in_voltage1_hardwaregain;
char *in_voltage1_hardwaregain_available;
char *in_voltage1_rf_port_select;
char *in_voltage1_rssi;
int *in_voltage2_offset;
int *in_voltage2_raw;
double in_voltage2_scale;
int *in_voltage_bb_dc_offset_tracking_en;
int *in_voltage_filter_fir_en;
char *in_voltage_gain_control_mode_available;
int *in_voltage_quadrature_tracking_en;
int *in_voltage_rf_bandwidth;
char *in_voltage_rf_bandwidth_available;
int *in_voltage_rf_dc_offset_tracking_en;
char *in_voltage_rf_port_select_available;
int *in_voltage_sampling_frequency;
char *in_voltage_sampling_frequency_available;
char *name;
int *out_altvoltage0_RX_LO_external;
int *out_altvoltage0_RX_LO_fastlock_load;
int *out_altvoltage0_RX_LO_fastlock_recall;//cat: out_altvoltage0_RX_LO_fastlock_recall: Invalid argument
char *out_altvoltage0_RX_LO_fastlock_save;
int *out_altvoltage0_RX_LO_fastlock_store;
char *out_altvoltage0_RX_LO_frequency;
char *out_altvoltage0_RX_LO_frequency_available;
int *out_altvoltage0_RX_LO_powerdown;
int *out_altvoltage1_TX_LO_external;
int *out_altvoltage1_TX_LO_fastlock_load;
int *out_altvoltage1_TX_LO_fastlock_recall;
char *out_altvoltage1_TX_LO_fastlock_save;
int *out_altvoltage1_TX_LO_fastlock_store;
char *out_altvoltage1_TX_LO_frequency;
char *out_altvoltage1_TX_LO_frequency_available;
int *out_altvoltage1_TX_LO_powerdown;
char *out_voltage0_hardwaregain;
char *out_voltage0_hardwaregain_available;
char *out_voltage0_rf_port_select;
char *out_voltage0_rssi;
char *out_voltage1_hardwaregain;
char *out_voltage1_hardwaregain_available;
char *out_voltage1_rf_port_select;
char *out_voltage1_rssi;
int *out_voltage2_raw;
double out_voltage2_scale;
int *out_voltage3_raw;
double out_voltage3_scale;
int *out_voltage_filter_fir_en;
int *out_voltage_rf_bandwidth;
char *out_voltage_rf_bandwidth_available;
char *out_voltage_rf_port_select_available;
int *out_voltage_sampling_frequency;
char *out_voltage_sampling_frequency_available;
char *rssi_gain_step_error;
char *rx_path_rates;
char *trx_rate_governor;
char *trx_rate_governor_available;
char *tx_path_rates;
int *xo_correction;
char *xo_correction_available;
char *direct_reg_access;
};
struct ad9361_rf_phy ad9361;
/*
* @description : read the specified file
* @param - filename : the path of the file which will be read
* @param - str : the read of file string
* @return : 0:success; other: failure
*/
static int file_data_read(char *filename, char *str)//only read a char data
{
int ret = 0;
FILE *data_stream;
data_stream = fopen(filename, "r"); /* read only open */
if(data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
ret = fscanf(data_stream, "%s", str);
if(!ret) {
printf("file read error!\r\n");
} else if(ret == EOF) {
/* Readjust the file pointer to the file header when you reach the end of the file */
fseek(data_stream, 0, SEEK_SET);
}
fclose(data_stream); /* close file */
return 0;
}
//read a string data, the read size is max_size
static int file_data_read_string(char *filename, char *str, size_t max_size)
{
FILE *data_stream;
data_stream = fopen(filename, "r");
if(data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
// Reset str to an empty string
str[0] = '\0';
char line[256]; // Adjust the size as needed
// Read lines until the end of the file
while (fgets(line, sizeof(line), data_stream) != NULL) {
// Concatenate the line to the existing content
strncat(str, line, max_size - strlen(str) - 1);
// Check if the entire line was read
if (str[strlen(str) - 1] == '\n') {
break;
}
}
fclose(data_stream); // Close the file
return 0;
}
/*
* @description : write the specified file
* @param - filename : the path of the file which will be read
* @param - data : the int value you will write to the file
* @return : 0:success; other: failure
*/
static int file_data_write(char *filename, int *data)
{
int ret = 0;
FILE *data_stream;
char str[20];
snprintf(str,sizeof(str), "%d", data);//turn integer to string
data_stream = fopen(filename, "w"); /* write only open */
if(data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
fprintf(data_stream,"%s",str);
fclose(data_stream); /* close file */
return 0;
}
/*
* @description : write the specified file
* @param - filename : the path of the file which will be read
* @param - data1 : the first int value you will write to the file
* @param - data2 : the second int value you will write to the file
* @return : 0: success; other: failure
*/
static int file_data_write_two(char *filename, int reg_addr, int data)
{
int ret = 0;
FILE *data_stream;
char str[40]; // Increased buffer size to accommodate two integers
snprintf(str, sizeof(str), "%d %d", reg_addr, data); // Concatenate two integers as a string
data_stream = fopen(filename, "w"); /* write only open */
if (data_stream == NULL) {
printf("can't open file %s\r\n", filename);
return -1;
}
fprintf(data_stream, "%s", str);
fclose(data_stream); /* close file */
return 0;
}
#define SENSOR_INT_DATA_SET(ret, index, data, member)\
dev->member = data;\
ret = file_data_write(file_path[index], data);\
#define SENSOR_INT_DATA_SET_TWO(ret, index, reg_addr, data, member)\
dev->member = data;\
ret = file_data_write_two(file_path[index], reg_addr, data);\
/*
* @description : get ad9361 data
* @param - dev : device struct
* @return : 0:success; other: failure
**/
static int sensor_read(struct ad9361_rf_phy *dev)
{
int ret = 0;
char str[MAX_BUFFER_SIZE];
/* get iio sysfs data */
file_data_read_string(file_path[CALIB_MODE], str,MAX_BUFFER_SIZE);
dev->calib_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[CALIB_MODE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->calib_mode_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, DCXO_TUNE_COARSE, str, dcxo_tune_coarse);
file_data_read_string(file_path[DCXO_TUNE_COARSE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->dcxo_tune_coarse_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, DCXO_TUNE_FINE, str, dcxo_tune_fine);
file_data_read_string(file_path[DCXO_TUNE_FINE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->dcxo_tune_fine_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[ENSM_MODE], str,MAX_BUFFER_SIZE);
dev->ensm_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[ENSM_MODE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->ensm_mode_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[FILTER_FIR_CONFIG], str,MAX_BUFFER_SIZE);
dev->filter_fir_config = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[GAIN_TABLE_CONFIG], str,MAX_BUFFER_SIZE);
dev->gain_table_config = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_OUT_VOLTAGE_FILTER_FIR_EN, str, in_out_voltage_filter_fir_en);
SENSOR_INT_DATA_GET(ret, IN_TEMP0_INPUT, str, in_temp0_input);
file_data_read_string(file_path[IN_VOLTAGE0_GAIN_CONTROL_MODE],str,MAX_BUFFER_SIZE);
dev->in_voltage0_gain_control_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->in_voltage0_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage0_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_RF_PORT_SELECT],str,MAX_BUFFER_SIZE);
dev->in_voltage0_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE0_RSSI], str,MAX_BUFFER_SIZE);
dev->in_voltage0_rssi = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_GAIN_CONTROL_MODE],str,MAX_BUFFER_SIZE);
dev->in_voltage1_gain_control_mode = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->in_voltage1_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage1_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_RF_PORT_SELECT], str,MAX_BUFFER_SIZE);
dev->in_voltage1_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[IN_VOLTAGE1_RSSI], str,MAX_BUFFER_SIZE);
dev->in_voltage1_rssi = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE2_OFFSET, str, in_voltage2_offset);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE2_RAW, str, in_voltage2_raw);
SENSOR_FLOAT_DATA_GET(ret, IN_VOLTAGE2_SCALE, str, in_voltage2_scale);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_BB_DC_OFFSET_TRACKING_EN, str, in_voltage_bb_dc_offset_tracking_en);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_FILTER_FIR_EN, str, in_voltage_filter_fir_en);
file_data_read_string(file_path[IN_VOLTAGE_GAIN_CONTROL_MODE_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_gain_control_mode_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_QUADRATURE_TRACKING_EN, str, in_voltage_quadrature_tracking_en);
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_RF_BANDWIDTH, str, in_voltage_rf_bandwidth);
file_data_read_string(file_path[IN_VOLTAGE_RF_BANDWIDTH_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_rf_bandwidth_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_RF_DC_OFFSET_TRACKING_EN, str, in_voltage_rf_dc_offset_tracking_en);
file_data_read_string(file_path[IN_VOLTAGE_RF_PORT_SELECT_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_rf_port_select_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, IN_VOLTAGE_SAMPLING_FREQUENCY, str, in_voltage_sampling_frequency);
file_data_read_string(file_path[IN_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->in_voltage_sampling_frequency_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[NAME], str,MAX_BUFFER_SIZE);
dev->name = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_EXTERNAL, str, out_altvoltage0_RX_LO_external);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_LOAD, str, out_altvoltage0_RX_LO_fastlock_load);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_RECALL, str, out_altvoltage0_RX_LO_fastlock_recall);//cat: out_altvoltage0_RX_LO_fastlock_recall: Invalid argument
file_data_read_string(file_path[OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_SAVE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage0_RX_LO_fastlock_save = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_FASTLOCK_STORE, str, out_altvoltage0_RX_LO_fastlock_store);
file_data_read_string(file_path[OUT_ALTVOLTAGE0_RX_LO_FREQUENCY], str,MAX_BUFFER_SIZE);
dev->out_altvoltage0_RX_LO_frequency = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_ALTVOLTAGE0_RX_LO_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage0_RX_LO_frequency_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE0_RX_LO_POWERDOWN, str, out_altvoltage0_RX_LO_powerdown);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_EXTERNAL, str, out_altvoltage1_TX_LO_external);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_LOAD, str, out_altvoltage1_TX_LO_fastlock_load);
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_RECALL, str, out_altvoltage1_TX_LO_fastlock_recall);//cat: out_altvoltage1_TX_LO_fastlock_recall: Invalid argument
file_data_read_string(file_path[OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_SAVE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage1_TX_LO_fastlock_save = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_FASTLOCK_STORE, str, out_altvoltage1_TX_LO_fastlock_store);
file_data_read_string(file_path[OUT_ALTVOLTAGE1_TX_LO_FREQUENCY], str,MAX_BUFFER_SIZE);
dev->out_altvoltage1_TX_LO_frequency = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_ALTVOLTAGE1_TX_LO_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_altvoltage1_TX_LO_frequency_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_ALTVOLTAGE1_TX_LO_POWERDOWN, str, out_altvoltage1_TX_LO_powerdown);
file_data_read_string(file_path[OUT_VOLTAGE0_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->out_voltage0_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE0_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage0_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE0_RF_PORT_SELECT], str,MAX_BUFFER_SIZE);
dev->out_voltage0_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE0_RSSI], str,MAX_BUFFER_SIZE);
dev->out_voltage0_rssi = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_HARDWAREGAIN], str,MAX_BUFFER_SIZE);
dev->out_voltage1_hardwaregain = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_HARDWAREGAIN_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage1_hardwaregain_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_RF_PORT_SELECT], str,MAX_BUFFER_SIZE);
dev->out_voltage1_rf_port_select = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE1_RSSI], str,MAX_BUFFER_SIZE);
dev->out_voltage1_rssi = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE2_RAW, str, out_voltage2_raw);
SENSOR_FLOAT_DATA_GET(ret, OUT_VOLTAGE2_SCALE, str, out_voltage2_scale);
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE3_RAW, str, out_voltage3_raw);
SENSOR_FLOAT_DATA_GET(ret, OUT_VOLTAGE3_SCALE, str, out_voltage3_scale);
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE_FILTER_FIR_EN, str, out_voltage_filter_fir_en);
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE_RF_BANDWIDTH, str, out_voltage_rf_bandwidth);
file_data_read_string(file_path[OUT_VOLTAGE_RF_BANDWIDTH_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage_rf_bandwidth_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[OUT_VOLTAGE_RF_PORT_SELECT_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage_rf_port_select_available = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, OUT_VOLTAGE_SAMPLING_FREQUENCY, str, out_voltage_sampling_frequency);
file_data_read_string(file_path[OUT_VOLTAGE_SAMPLING_FREQUENCY_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->out_voltage_sampling_frequency_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[RSSI_GAIN_STEP_ERROR], str,MAX_BUFFER_SIZE);
dev->rssi_gain_step_error = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[RX_PATH_RATES], str,MAX_BUFFER_SIZE);
dev->rx_path_rates = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[TRX_RATE_GOVERNOR], str,MAX_BUFFER_SIZE);
dev->trx_rate_governor = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[TRX_RATE_GOVERNOR_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->trx_rate_governor_available = strdup(str);// Allocate memory for a copy of the string
file_data_read_string(file_path[TX_PATH_RATES], str,MAX_BUFFER_SIZE);
dev->tx_path_rates = strdup(str);// Allocate memory for a copy of the string
SENSOR_INT_DATA_GET(ret, XO_CORRECTION, str, xo_correction);
file_data_read_string(file_path[XO_CORRECTION_AVAILABLE], str,MAX_BUFFER_SIZE);
dev->xo_correction_available = strdup(str);// Allocate memory for a copy of the string
// SENSOR_INT_DATA_GET(ret, DIRECT_REG_ACCESS, str, direct_reg_access);
file_data_read_string(file_path[DIRECT_REG_ACCESS], str,MAX_BUFFER_SIZE);
dev->direct_reg_access = strdup(str);// Allocate memory for a copy of the string
return ret;
}
/*
* @description : read ad9361 reg
* @param - dev : device struct
* @return : 0:success; other: failure
**/
static int sensor_read_reg(struct ad9361_rf_phy *dev, int reg_addr)
{
int ret = 0;
char str[MAX_BUFFER_SIZE];
SENSOR_INT_DATA_SET(ret, DIRECT_REG_ACCESS, reg_addr, direct_reg_access);
file_data_read_string(file_path[DIRECT_REG_ACCESS], str,MAX_BUFFER_SIZE);
dev->direct_reg_access = strdup(str);// Allocate memory for a copy of the string
printf("0x%x,%s\r\n",reg_addr,ad9361.direct_reg_access);
return ret;
}
/*
* @description : write ad9361 reg
* @param - dev : device struct
* @return : 0:success; other: failure
**/
static int sensor_write_reg(struct ad9361_rf_phy *dev, int reg_addr, int data)
{
int ret = 0;
char str[MAX_BUFFER_SIZE];
SENSOR_INT_DATA_SET_TWO(ret, DIRECT_REG_ACCESS, reg_addr, data,direct_reg_access);
file_data_read_string(file_path[DIRECT_REG_ACCESS], str,MAX_BUFFER_SIZE);
dev->direct_reg_access = strdup(str);// Allocate memory for a copy of the string
printf("0x%x,0x%x,%s\r\n",reg_addr,data,ad9361.direct_reg_access);
return ret;
}
int main(void)
{
printf("enter mian!\r\n");
SENSOR_INT_DATA_SET(ret, OUT_VOLTAGE_RF_BANDWIDTH, 18000000, out_voltage_rf_bandwidth);//write OUT VOLTAGE RF BANDWIDTH of the iio device
ret = sensor_read(&ad9361);//read all ad9361 iio device drivers' value
if(ret == 0){
printf("out_voltage_rf_bandwidth=%s\r\n",ad9361.out_voltage_rf_bandwidth);
while(1)
{
sensor_write_reg(&ad9361,0x3F5,0x01);//write refgister
sensor_read_reg(&ad9361,0x3F5);//read register
sleep(5);
}
return(0);
}
编译Vitis工程,生成.elf文件,将debug文件夹下的.elf文件拷贝到开发板Linux的opt文件夹下。
进入开发板opt文件夹下,chmod加运行权限,然后直接执行.elf文件,即可完成读写操作。