Professional Documents
Culture Documents
DM Compat
DM Compat
#include "dm_compat.h"
MCOMPAT_CHAIN_T s_chain_ops;
MCOMPAT_CHAIN_T* s_chain_ops_p = &s_chain_ops;
void init_mcompat_chain(void)
{
memset(&s_chain_ops, 0, sizeof(s_chain_ops));
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
s_chain_ops_p->power_on = zynq_chain_power_on;
s_chain_ops_p->power_down = zynq_chain_power_down;
s_chain_ops_p->hw_reset = zynq_chain_hw_reset;
s_chain_ops_p->power_on_all = zynq_chain_power_on_all;
s_chain_ops_p->power_down_all = zynq_chain_power_down_all;
break;
case PLATFORM_ORANGE_PI:
s_chain_ops_p->power_on = opi_chain_power_on;
s_chain_ops_p->power_down = opi_chain_power_down;
s_chain_ops_p->hw_reset = opi_chain_hw_reset;
s_chain_ops_p->power_on_all = opi_chain_power_on_all;
s_chain_ops_p->power_down_all = opi_chain_power_down_all;
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
void exit_mcompat_chain(void)
{
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
break;
case PLATFORM_ORANGE_PI:
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
return s_chain_ops_p->power_on(chain_id);
}
return s_chain_ops_p->power_down(chain_id);
}
return s_chain_ops_p->hw_reset(chain_id);
}
bool mcompat_chain_power_on_all(void)
{
if (s_chain_ops_p->power_on_all == NULL)
{
applog(LOG_ERR, "%s not register !", __FUNCTION__);
return false;
}
return s_chain_ops_p->power_on_all();
}
bool mcompat_chain_power_down_all(void)
{
if (s_chain_ops_p->power_down_all == NULL)
{
applog(LOG_ERR, "%s not register !", __FUNCTION__);
return false;
}
return s_chain_ops_p->power_down_all();
}
MCOMPAT_CMD_T s_cmd_ops;
MCOMPAT_CMD_T* s_cmd_ops_p = &s_cmd_ops;
void init_mcompat_cmd(void)
{
memset(&s_cmd_ops, 0, sizeof(s_cmd_ops));
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
init_spi_cmd(g_chain_num);
s_cmd_ops_p->set_speed = spi_set_spi_speed;
s_cmd_ops_p->cmd_reset = spi_cmd_reset;
s_cmd_ops_p->cmd_bist_start = spi_cmd_bist_start;
s_cmd_ops_p->cmd_bist_fix = spi_cmd_bist_fix;
s_cmd_ops_p->cmd_bist_collect = spi_cmd_bist_collect;
s_cmd_ops_p->cmd_read_register = spi_cmd_read_register;
s_cmd_ops_p->cmd_write_register = spi_cmd_write_register;
s_cmd_ops_p->cmd_read_write_reg0d = spi_cmd_read_write_reg0d;
s_cmd_ops_p->cmd_read_result = spi_cmd_read_result;
s_cmd_ops_p->cmd_write_job = spi_cmd_write_job;
break;
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
hub_init();
init_hub_cmd(g_chain_num, g_chip_num);
s_cmd_ops_p->set_speed = hub_set_spi_speed;
s_cmd_ops_p->cmd_reset = hub_cmd_reset;
s_cmd_ops_p->cmd_bist_start = hub_cmd_bist_start;
s_cmd_ops_p->cmd_bist_fix = hub_cmd_bist_fix;
s_cmd_ops_p->cmd_bist_collect = hub_cmd_bist_collect;
s_cmd_ops_p->cmd_read_register = hub_cmd_read_register;
s_cmd_ops_p->cmd_write_register = hub_cmd_write_register;
s_cmd_ops_p->cmd_read_write_reg0d = hub_cmd_read_write_reg0d;
s_cmd_ops_p->cmd_read_result = hub_cmd_read_result;
s_cmd_ops_p->cmd_write_job = hub_cmd_write_job;
s_cmd_ops_p->cmd_auto_nonce = hub_cmd_auto_nonce;
s_cmd_ops_p->cmd_read_nonce = hub_cmd_read_nonce;
break;
case PLATFORM_ORANGE_PI:
init_opi_cmd();
s_cmd_ops_p->set_speed = opi_set_spi_speed;
s_cmd_ops_p->cmd_reset = opi_cmd_reset;
s_cmd_ops_p->cmd_bist_start = opi_cmd_bist_start;
s_cmd_ops_p->cmd_bist_fix = opi_cmd_bist_fix;
s_cmd_ops_p->cmd_bist_collect = opi_cmd_bist_collect;
s_cmd_ops_p->cmd_read_register = opi_cmd_read_register;
s_cmd_ops_p->cmd_write_register = opi_cmd_write_register;
s_cmd_ops_p->cmd_read_write_reg0d = opi_cmd_read_write_reg0d;
s_cmd_ops_p->cmd_read_result = opi_cmd_read_result;
s_cmd_ops_p->cmd_write_job = opi_cmd_write_job;
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
void exit_mcompat_cmd(void)
{
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
exit_spi_cmd(g_chain_num);
break;
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
hub_deinit();
exit_hub_cmd(g_chain_num);
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
s_cmd_ops_p->set_speed(chain_id, index);
return true;
}
return s_cmd_ops_p->cmd_get_temp(fan_temp);
}
int g_temp_hi_thr;
int g_temp_lo_thr;
int g_temp_start_thr;
int g_dangerous_temp;
int g_work_temp;
int g_fan_speed;
return 0;
}
#endif
}else{
if (temp_ctrl[spi_id].temp_highest[0] &&
temp_ctrl[spi_id].temp_highest[1])
temp_hi = temp_ctrl[spi_id].temp_highest[0] >
temp_ctrl[spi_id].temp_highest[1] ?
temp_ctrl[spi_id].temp_highest[1]:temp_ctrl[spi_id].temp_highest[0];
else if (temp_ctrl[spi_id].temp_highest[0] &&
temp_ctrl[spi_id].temp_highest[2])
temp_hi = temp_ctrl[spi_id].temp_highest[0] >
temp_ctrl[spi_id].temp_highest[2] ?
temp_ctrl[spi_id].temp_highest[2]:temp_ctrl[spi_id].temp_highest[0];
else if (temp_ctrl[spi_id].temp_highest[1] &&
temp_ctrl[spi_id].temp_highest[2])
temp_hi = temp_ctrl[spi_id].temp_highest[1] >
temp_ctrl[spi_id].temp_highest[2] ?
temp_ctrl[spi_id].temp_highest[2]:temp_ctrl[spi_id].temp_highest[1];
}
temp_ctrl[spi_id].final_temp_hi = temp_hi;
int temp_lo = 0;
if (temp_ctrl[spi_id].temp_lowest[0] && temp_ctrl[spi_id].temp_lowest[1] &&
temp_ctrl[spi_id].temp_lowest[2])
{
temp_lo = temp_ctrl[spi_id].temp_lowest[0] <
temp_ctrl[spi_id].temp_lowest[1] ?
temp_ctrl[spi_id].temp_lowest[1]:temp_ctrl[spi_id].temp_lowest[0];
temp_lo = temp_lo < temp_ctrl[spi_id].temp_lowest[2] ?
temp_ctrl[spi_id].temp_lowest[2]:temp_lo;
}else{
if (temp_ctrl[spi_id].temp_lowest[0] &&
temp_ctrl[spi_id].temp_lowest[1])
temp_lo = temp_ctrl[spi_id].temp_lowest[0] <
temp_ctrl[spi_id].temp_lowest[1] ?
temp_ctrl[spi_id].temp_lowest[1]:temp_ctrl[spi_id].temp_lowest[0];
else if (temp_ctrl[spi_id].temp_lowest[0] &&
temp_ctrl[spi_id].temp_lowest[2])
temp_lo = temp_ctrl[spi_id].temp_lowest[0] <
temp_ctrl[spi_id].temp_lowest[2] ?
temp_ctrl[spi_id].temp_lowest[2]:temp_ctrl[spi_id].temp_lowest[0];
else if (temp_ctrl[spi_id].temp_lowest[1] &&
temp_ctrl[spi_id].temp_lowest[2])
temp_lo = temp_ctrl[spi_id].temp_lowest[1] <
temp_ctrl[spi_id].temp_lowest[2] ?
temp_ctrl[spi_id].temp_lowest[2]:temp_ctrl[spi_id].temp_lowest[1];
}
temp_ctrl[spi_id].final_temp_lo = temp_lo;
applog(LOG_INFO,"temp:%d,%d,
%d",temp_ctrl[spi_id].final_temp_hi,temp_ctrl[spi_id].final_temp_avg,temp_ctrl[spi_
id].final_temp_lo);
return ;
}
type = misc_get_vid_type();
switch(type)
{
case MCOMPAT_LIB_VID_VID_TYPE:
{
duty = 100-speed;
break;
}
case MCOMPAT_LIB_VID_I2C_TYPE:
case MCOMPAT_LIB_VID_UART_TYPE:
{
duty = speed;
break;
}
case MCOMPAT_LIB_VID_GPIO_I2C_TYPE:
{
applog(LOG_ERR, "%s,%d:no impl
type:MCOMPAT_LIB_VID_GPIO_I2C_TYPE.", __FILE__, __LINE__);
break;
}
default:
{
applog(LOG_ERR, "%s,%d:err vid type:%d.", __FILE__, __LINE__,
type);
break;
}
}
mcompat_fan_speed_set(fan_id,g_fan_speed);
mcompat_deal_temp(i,fan_temp);
if (delt_temp > 3)
{
if ((delt_speed < 2) && (cnt < 3))
{
cnt ++;
return;
}
cnt = 0;
if (fan_temp->speed != fan_temp->last_fan_speed)
{
fan_temp->last_fan_speed = fan_temp->speed;
fan_temp->last_fan_temp = temp_hi;
mcompat_fan_speed_set(0,fan_temp->speed);
}
}
MCOMPAT_GPIO_T s_gpio_ops;
MCOMPAT_GPIO_T* s_gpio_ops_p = &s_gpio_ops;
void init_mcompat_gpio(void)
{
memset(&s_gpio_ops, 0, sizeof(s_gpio_ops));
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
init_spi_gpio(g_chain_num);
s_gpio_ops_p->set_power_en = spi_set_power_en;
s_gpio_ops_p->set_start_en = spi_set_start_en;
s_gpio_ops_p->set_reset = spi_set_reset;
s_gpio_ops_p->set_led = spi_set_led;
s_gpio_ops_p->get_plug = spi_get_plug;
s_gpio_ops_p->set_vid = spi_set_vid;
break;
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
init_hub_gpio();
s_gpio_ops_p->set_power_en = hub_set_power_en;
s_gpio_ops_p->set_start_en = hub_set_start_en;
s_gpio_ops_p->set_reset = hub_set_reset;
s_gpio_ops_p->set_led = hub_set_led;
s_gpio_ops_p->get_plug = hub_get_plug;
s_gpio_ops_p->set_vid = hub_set_vid;
s_gpio_ops_p->get_button = hub_get_button;
s_gpio_ops_p->set_green_led = hub_set_green_led;
s_gpio_ops_p->set_red_led = hub_set_red_led;
break;
case PLATFORM_ORANGE_PI:
s_gpio_ops_p->set_power_en = opi_set_power_en;
s_gpio_ops_p->set_start_en = opi_set_start_en;
s_gpio_ops_p->set_reset = opi_set_reset;
s_gpio_ops_p->set_led = opi_set_led;
s_gpio_ops_p->get_plug = opi_get_plug;
s_gpio_ops_p->set_vid = opi_set_vid;
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
void exit_mcompat_gpio(void)
{
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
exit_spi_gpio(g_chain_num);
break;
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
s_gpio_ops_p->set_power_en(chain_id, val);
}
s_gpio_ops_p->set_start_en(chain_id, val);
}
s_gpio_ops_p->set_led(chain_id, val);
}
return s_gpio_ops_p->get_plug(chain_id);
}
return true;
}
int mcompat_get_button(void)
{
if (s_gpio_ops_p->get_button == NULL)
{
applog(LOG_ERR, "%s not register !", __FUNCTION__);
return -1;
}
return s_gpio_ops_p->get_button();
}
void mcompat_set_green_led(int mode)
{
if (s_gpio_ops_p->set_green_led == NULL)
{
applog(LOG_ERR, "%s not register !", __FUNCTION__);
return;
}
s_gpio_ops_p->set_green_led(mode);
}
s_gpio_ops_p->set_red_led(mode);
}
MCOMPAT_PWM_T s_pwm_ops;
MCOMPAT_PWM_T* s_pwm_ops_p = &s_pwm_ops;
void init_mcompat_pwm(void)
{
memset(&s_pwm_ops, 0, sizeof(s_pwm_ops));
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
s_pwm_ops_p->set_pwm = zynq_set_pwm;
break;
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
s_pwm_ops_p->set_pwm = hub_set_pwm;
break;
case PLATFORM_ORANGE_PI:
s_pwm_ops_p->set_pwm = opi_set_pwm;
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
void exit_mcompat_pwm(void)
{
switch(g_platform)
{
case PLATFORM_ZYNQ_SPI_G9:
case PLATFORM_ZYNQ_SPI_G19:
break;
case PLATFORM_ZYNQ_HUB_G9:
case PLATFORM_ZYNQ_HUB_G19:
break;
default:
applog(LOG_ERR, "the platform is undefined !!!");
break;
}
}
switch(g_miner_type)
{
case MCOMPAT_LIB_MINER_TYPE_T1:
return (588.0f - temp) * 2 / 3 + 0.5f; // T1
case MCOMPAT_LIB_MINER_TYPE_T3:
case MCOMPAT_LIB_MINER_TYPE_D11:
case MCOMPAT_LIB_MINER_TYPE_D12:
default:
return (595.0f - temp) * 2 / 3 + 0.5f; // T3 D11 D12
}
}
// enable auto 0a
enable_auto_cmd0a(chain_id, 100, 33, 24, 0, 0);
do {
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP * chain_id +
AUTO_CMD0A_REG4_ADDR);
timeout--;
cgsleep_ms(1); // usleep(1);
} while(timeout && !((reg_val >> 24) & 0x1));
if(!timeout)
return false;
// temp_lo:
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP * chain_id + AUTO_CMD0A_REG2_ADDR);
tmp_val0 = mcompat_temp_to_centigrade(reg_val & 0x3ff);
tmp_val1 = mcompat_temp_to_centigrade((reg_val >> 10) & 0x3ff);
tmp_val2 = mcompat_temp_to_centigrade((reg_val >> 20) & 0x3ff);
// applog(LOG_DEBUG, "REG2: %d, %d, %d", tmp_val0, tmp_val1, tmp_val2);
chain_tmp->tmp_lo = (tmp_val0 + tmp_val1 + tmp_val2) / 3;
// chain_tmp->tmp_lo = tmp_val1;
// temp_hi:
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP * chain_id + AUTO_CMD0A_REG3_ADDR);
tmp_val0 = mcompat_temp_to_centigrade(reg_val & 0x3ff);
tmp_val1 = mcompat_temp_to_centigrade((reg_val >> 10) & 0x3ff);
tmp_val2 = mcompat_temp_to_centigrade((reg_val >> 20) & 0x3ff);
// applog(LOG_DEBUG, "REG3: %d, %d, %d", tmp_val0, tmp_val1, tmp_val2);
chain_tmp->tmp_hi = (tmp_val0 + tmp_val1 + tmp_val2) / 3;
// chain_tmp->tmp_hi = tmp_val1;
// temp_avg:
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP * chain_id + AUTO_CMD0A_REG4_ADDR);
tmp_val1 = mcompat_temp_to_centigrade(2 * (reg_val & 0xffff) / g_chip_num);
// applog(LOG_DEBUG, "REG4: %d / %d", tmp_val1, g_chip_num);
chain_tmp->tmp_avg = tmp_val1;
// disable auto 0a
disable_auto_cmd0a(chain_id, 100, 33, 24, 0, 0);
timeout = 1000;
do {
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP * chain_id +
AUTO_CMD0A_REG4_ADDR);
timeout--;
cgsleep_ms(1); // usleep(1);
} while(timeout && !((reg_val >> 24) & 0x1));
if(!timeout)
return false;
return true;
}
void mcompat_watchdog_keep_alive(void)
{
int dummy = 0;
ioctl(s_watchdog_fd, WDIOC_KEEPALIVE, &dummy);
}
void mcompat_watchdog_open(void)
{
s_watchdog_fd = open(MCOMPAT_WATCHDOG_DEV, O_WRONLY);
if (-1 == s_watchdog_fd)
{
applog(LOG_ERR, "%s watchdog device can't be enabled.",
MCOMPAT_WATCHDOG_DEV);
}
}
void mcompat_watchdog_close(void)
{
close(s_watchdog_fd);
}
fp = popen(cmd, "r");
if (NULL == fp)
{
applog(LOG_ERR, "failed to open pipe for command %s", cmd);
return 0;
}
return offset;
}
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(host);
serv.sin_port = htons(port);
if (connect(sock, (struct sockaddr *)&serv, sizeof(struct sockaddr)) < 0)
{
printf("Socket connect failed: %s", SOCK_ERR_MSG);
return -1;
}
while(1)
{
if ((len - p) < 1)
{
len += SOCK_SIZE;
buf = realloc(buf, len+1);
if (!buf)
{
printf("Err: OOM (%d)", (int)(len+1));
return -1;
}
}
if (0 == n)
{
break;
}
p += n;
}
buf[p] = '\0';
printf("%s", buf);
free(buf);
buf = NULL;
}
close(sock);
return ret;
}
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(host);
serv.sin_port = htons(port);
ret = false;
if (0 == connect(sock, (struct sockaddr *)&serv, sizeof(struct sockaddr)))
{
ret = true;
}
close(sock);
return ret;
}
while (isspace(*str))
{
str++;
}
return str;
}
int misc_get_board_version(void)
{
FILE* fd = NULL;
char buffer[64] = {'\0'};
int version = MCOMPAT_LIB_HARDWARE_VERSION_ERR;
fd = fopen(MCOMPAT_LIB_HARDWARE_VERSION_FILE, "r");
if (fd == NULL)
{
applog(LOG_ERR, "open hwver file:%s failed! ",
MCOMPAT_LIB_HARDWARE_VERSION_FILE);
}
memset(buffer, 0, sizeof(buffer));
FREAD(buffer, 8, 1, fd);
fclose(fd);
return version;
}
int misc_get_miner_type(void)
{
FILE *fd = NULL;
char buffer[64] = {'\0'};
int miner_type = MCOMPAT_LIB_MINER_TYPE_ERR;
fd = fopen(MCOMPAT_LIB_MINER_TYPE_FILE, "r");
if (fd == NULL)
{
applog(LOG_ERR, "open miner type file:%s failed!",
MCOMPAT_LIB_MINER_TYPE_FILE);
}
memset(buffer, 0, sizeof(buffer));
FREAD(buffer, 8, 1, fd);
fclose(fd);
return miner_type;
}
int misc_get_vid_type(void)
{
int val_b9 = 0;
int val_a10 = 0;
int val = 0;
int type = 0;
zynq_gpio_init(MCOMPAT_CONFIG_B9_GPIO, 1);
zynq_gpio_init(MCOMPAT_CONFIG_A10_GPIO, 1);
val_b9 = zynq_gpio_read(MCOMPAT_CONFIG_B9_GPIO);
val_a10 = zynq_gpio_read(MCOMPAT_CONFIG_A10_GPIO);
#if 1
applog(LOG_INFO, "b9 pin:%d,a10 pin:%d", MCOMPAT_CONFIG_B9_GPIO,
MCOMPAT_CONFIG_A10_GPIO);
applog(LOG_INFO, "b9:%d,a10:%d,val:0x%08x", val_b9, val_a10, val);
#endif
switch(val)
{
/* xhn */
case 0x00000003:
{
type = MCOMPAT_LIB_VID_VID_TYPE;
applog(LOG_INFO, "cow vid vid");
break;
}
/* zle*/
case 0x00000002:
{
type = MCOMPAT_LIB_VID_UART_TYPE;
applog(LOG_INFO, "zl uart vid");
break;
}
/* hnd */
case 0x00000000:
{
type = MCOMPAT_LIB_VID_I2C_TYPE;
applog(LOG_INFO, "hnd iic vid");
break;
}
/* unused */
case 0x00000001:
default:
{
type = MCOMPAT_LIB_VID_ERR_TYPE;
applog(LOG_ERR, "err vid type:b9:%d,a10:%d,val:0x%08x", val_b9,
val_a10, val);
break;
}
}
#if 0
type = MCOMPAT_LIB_VID_UART_TYPE;
type = MCOMPAT_LIB_VID_I2C_TYPE;
#endif
zynq_gpio_exit(MCOMPAT_CONFIG_B9_GPIO);
zynq_gpio_exit(MCOMPAT_CONFIG_A10_GPIO);
return type;
}
fp = popen(cmd, "r");
if (NULL == fp)
{
applog(LOG_ERR, "popen error:%s,%s,%d.", cmd, rst_buf, buf_size);
}
else
{
go_ptr = rst_buf;
memset(go_ptr, 0, buf_size);
for(i = 0; i < buf_size; i++)
{
c = fgetc(fp);
if (isprint(c))
{
*go_ptr++ = c;
fprintf(stderr, "%s,%d: %c", __FILE__, __LINE__, c);
}
else
{
break;
}
}
rst_buf[buf_size-1] = '\0';
pclose(fp);
}
}
reg[6] = (src_reg[6]|0x04);
memcpy(tmp_reg,reg,REG_LENGTH);
mcompat_cmd_write_register(chain_id,chip_id,tmp_reg,REG_LENGTH);
cgsleep_ms(1); //usleep(200);
mcompat_cmd_write_register(chain_id,chip_id,tmp_reg,REG_LENGTH);
cgsleep_ms(1); //usleep(200);
reg[7] = (src_reg[7]|0x80);
memcpy(tmp_reg,reg,REG_LENGTH);
mcompat_cmd_write_register(chain_id,chip_id,tmp_reg,REG_LENGTH);
cgsleep_ms(1); //usleep(200);
reg[6] = (src_reg[6]|0x04);
memcpy(tmp_reg,reg,REG_LENGTH);
mcompat_cmd_write_register(chain_id,chip_id,tmp_reg,REG_LENGTH);
cgsleep_ms(1); //usleep(200);
tsadc_divider_tmp = (pll_clk/2)*1000/16/650;
tsadc_divider = (unsigned char)(tsadc_divider_tmp & 0xff);
buffer[5] = 0x00 | tsadc_divider;
if (count > 2)
return (double) (total - max - min) / (count - 2);
else
return 0;
}
/* Adjust vid till we are just above volt_target. We should have already set
* vid_start before calling this function. */
int mcompat_find_chain_vid(int chain_id, int chip_num, int vid_start, double
volt_target)
{
int chip_volt[MCOMPAT_CONFIG_MAX_CHIP_NUM] = {0};
int vid = vid_start;
double volt_avg;
mcompat_cfg_tsadc_divider(chain_id, 120);
cgsleep_ms(1);
mcompat_get_chip_volt(chain_id, chip_volt);
volt_avg = mcompat_get_average_volt(chip_volt, chip_num);
applog(LOG_NOTICE, "Chain %d VID %d voltage %.1f", chain_id, vid, volt_avg);
mcompat_get_chip_volt(chain_id, chip_volt);
volt_avg = mcompat_get_average_volt(chip_volt, chip_num);
applog(LOG_NOTICE, "Chain %d VID %d voltage %.1f", chain_id, vid, volt_avg);
/* Now go down VID till we're above the target, final point should
* be closest without going below voltage */
while (volt_avg < volt_target) {
if (vid <= VID_MIN) {
applog(LOG_WARNING, "Chain %d unable to get above target voltage
%.1f by VID %d",
chain_id, volt_target, vid);
break;
}
vid--;
mcompat_set_vid(chain_id, vid);
cgsleep_ms(500);
mcompat_get_chip_volt(chain_id, chip_volt);
volt_avg = mcompat_get_average_volt(chip_volt, chip_num);
applog(LOG_NOTICE, "Chain %d VID %d voltage %.1f", chain_id, vid,
volt_avg);
}
return vid;
}
fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);
if (-1 == fd)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
memset(fvalue, 0, sizeof(fvalue));
sprintf(fvalue, "%d", pin);
write_bytes = write(fd, fvalue, strlen(fvalue));
if (-1 == write_bytes)
{
if (EBUSY == errno)
{
close(fd);
return;
}
else
{
applog(LOG_ERR, "%s,%d: %d,%s.", __FILE__, __LINE__, errno,
strerror(errno));
}
}
close(fd);
memset(fpath, 0, sizeof(fpath));
sprintf(fpath, SYSFS_GPIO_DIR_STR, pin);
fd = open(fpath, O_WRONLY);
if (-1 == fd)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
if (0 == dir)
{
write_bytes = write(fd, SYSFS_GPIO_DIR_OUT,
sizeof(SYSFS_GPIO_DIR_OUT));
if (-1 == write_bytes)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__,
strerror(errno));
}
}
else
{
write_bytes = write(fd, SYSFS_GPIO_DIR_IN, sizeof(SYSFS_GPIO_DIR_IN));
if (-1 == write_bytes)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__,
strerror(errno));
}
}
close(fd);
return;
}
memset(fpath, 0, sizeof(fpath));
sprintf(fpath, SYSFS_GPIO_VAL_STR, pin);
fd = open(fpath, O_WRONLY);
if (-1 == fd) {
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
goto out;
}
if (0 == val) {
write_bytes = write(fd, SYSFS_GPIO_VAL_LOW,
sizeof(SYSFS_GPIO_VAL_LOW));
if (-1 == write_bytes) {
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__,
strerror(errno));
goto out_close;
}
} else {
write_bytes = write(fd, SYSFS_GPIO_VAL_HIGH,
sizeof(SYSFS_GPIO_VAL_HIGH));
if (-1 == write_bytes) {
applog(LOG_ERR, "%s,%d: %s,%s.", __FILE__, __LINE__, fpath,
strerror(errno));
goto out_close;
}
}
ret = true;
out_close:
close(fd);
out:
return ret;
}
memset(fpath, 0, sizeof(fpath));
sprintf(fpath, SYSFS_GPIO_VAL_STR, pin);
fd = open(fpath, O_RDONLY);
if (-1 == fd)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
memset(fvalue, 0, sizeof(fvalue));
read_bytes = read(fd, fvalue, 1);
if (-1 == read_bytes)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
close(fd);
if ('0' == fvalue[0])
{
val = 0;
}
else if ('1' == fvalue[0])
{
val = 1;
}
else
{
val = -1;
}
return val;
}
void zynq_gpio_exit(int __maybe_unused pin)
{
return;
}
pthread_mutex_t s_pwm_lock;
//pthread_mutex_lock(&s_pwm_lock);
fd = open(SYSFS_PWM_DEV, O_RDWR);
if (fd < 0)
{
applog(LOG_ERR, "open %s fail", SYSFS_PWM_DEV);
//pthread_mutex_unlock(&s_pwm_lock);
return;
}
close(fd);
//pthread_mutex_unlock(&s_pwm_lock);
return;
}
zynq_spi_clock_init();
zynq_set_spi_speed(MCOMPAT_CONFIG_SPI_DEFAULT_SPEED);
spi->fd = fd;
pthread_mutex_init(&(spi->lock), NULL);
close(spi->fd);
return;
}
pthread_mutex_unlock(&spi->lock);
return;
}
pthread_mutex_unlock(&spi->lock);
return;
}
void zynq_spi_clock_init(void)
{
int fd = 0;
ssize_t write_bytes = 0;
char fvalue[BUF_MAX] = {'\0'};
fd = access(SYSFS_VAL_STR, F_OK);
if (0 == fd)
{
return;
}
fd = open(SYSFS_EXPORT, O_WRONLY);
if (-1 == fd)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
memset(fvalue, 0, sizeof(fvalue));
sprintf(fvalue, "%s", "fclk1");
write_bytes = write(fd, fvalue, strlen(fvalue));
if (-1 == write_bytes)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
close(fd);
return;
}
return;
}
fd = open(SYSFS_VID_DEV, O_RDWR);
if (-1 == fd)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
return 0;
}
fd = open(SYSFS_VID_DEV, O_RDWR);
if (-1 == fd)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
if (ioctl(fd, IOCTL_SET_CHAIN_0, chain_id) < 0)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
if (ioctl(fd, IOCTL_SET_VALUE_0, 0x100 | level) < 0)
{
applog(LOG_ERR, "%s,%d: %s.", __FILE__, __LINE__, strerror(errno));
}
close(fd);
return 0;
}
#if 0
/* DUPES FIXME THIS ONE ISN'T USED */
typedef struct HUB_DEV_TAG {
volatile uint8_t *vir_base;
uint32_t phy_addr;
const char *name;
} HUB_DEV_T;
void hub_hardware_init(void)
{
int fd = 0;
int i = 0;
int iMax = sizeof(s_dev_list) / sizeof(s_dev_list[0]);
close(fd);
}
void hub_hardware_deinit(void)
{
int i = 0;
int iMax = sizeof(s_dev_list) / sizeof(s_dev_list[0]);
type = misc_get_vid_type();
switch(type)
{
case MCOMPAT_LIB_VID_VID_TYPE:
{
hub_set_vid_vid(chain_id, vol);
return true;
}
case MCOMPAT_LIB_VID_I2C_TYPE:
{
if (hub_set_vid_i2c(chain_id, vol))
{
return true;
}
else
{
return false;
}
}
case MCOMPAT_LIB_VID_UART_TYPE:
{
if (hub_set_vid_uart(chain_id, vol))
{
return true;
}
else
{
return false;
}
}
case MCOMPAT_LIB_VID_GPIO_I2C_TYPE:
{
applog(LOG_ERR, "%s,%d:no impl
type:MCOMPAT_LIB_VID_GPIO_I2C_TYPE.", __FILE__, __LINE__);
break;
}
default:
{
applog(LOG_ERR, "%s,%d:err vid type:%d.", __FILE__, __LINE__,
type);
break;
}
}
return true;
}
set_vol_on_i2c(chan_id + 1 , vol);
return true;
}
hub_set_vid_uart_select(chain_id);
send_uart("/dev/ttyPS1", byte);
return true;
}
fd = open(I2C_DEVICE_NAME, O_RDWR);
if(fd < 0) {
applog(LOG_ERR, "%s,%d:open %s failled: %d.", __FILE__, __LINE__,
I2C_DEVICE_NAME, errno);
return false;
}
buffer[0] = 0x00;
buffer[1] = 0xab;
buffer[2] = 0x00;
buffer[3] = 0x70;
buffer[4] = 0x00;
buffer[5] = 0x01;
buffer[6] = (time/30);
for (i = 0; i < 7; i++)
sum = sum + buffer[i];
buffer[7] = sum & 0xff;
buffer[8] = 0xcd;
messages[0].addr = I2C_SLAVE_ADDR;
messages[0].flags = I2C_M_IGNORE_NAK;
messages[0].len = sizeof(buffer);
messages[0].buf = buffer;
packets.msgs = messages;
packets.nmsgs = 1;
close(fd);
return true;
}
fd = open(I2C_DEVICE_NAME, O_RDWR);
if(fd < 0) {
applog(LOG_ERR, "%s,%d:open %s failled: %d.", __FILE__, __LINE__,
I2C_DEVICE_NAME, errno);
return false;
}
buffer[0] = 0x00;
buffer[1] = 0xab;
buffer[2] = 0x00;
buffer[3] = 0x85;
buffer[4] = 0x00;
buffer[5] = 0x02;
buffer[6] = chain;
if(val != 0)
buffer[7] = 0x01;
else
buffer[7] = 0x02;
for (i = 0; i < 8; i++)
sum = sum + buffer[i];
buffer[8] = sum & 0xff;
buffer[9] = 0xcd;
messages[0].addr = I2C_SLAVE_ADDR;
messages[0].flags = I2C_M_IGNORE_NAK;
messages[0].len = sizeof(buffer);
messages[0].buf = buffer;
packets.msgs = messages;
packets.nmsgs = 1;
close(fd);
return true;
}
fd = open(I2C_DEVICE_NAME, O_RDWR);
if (fd < 0)
{
applog(LOG_ERR, "%s,%d:open %s failled: %d.", __FILE__, __LINE__,
I2C_DEVICE_NAME, errno);
return false;
}
buffer[0] = 0x00;
buffer[1] = 0xab;
buffer[2] = 0x00;
buffer[3] = 0x83;
buffer[4] = 0x00;
buffer[5] = 0x04;
buffer[6] = chain;
buffer[7] = 0x00;
buffer[8] = ((vol >> 0) & 0xff);
buffer[9] = ((vol >> 8) & 0xff);
packets.msgs = messages;
packets.nmsgs = 1;
close(fd);
return true;
}
buf[0] = 0xaa;
buf[1] = 0x2;
buf[2] = 0x1;
buf[3] = byte;
buf[4] = (~(buf[1]+buf[2]+buf[3]))+1;
rst = write(tty_fd, &buf, 5);
if (-1 == rst)
{
close(tty_fd);
applog(LOG_ERR, "%s,%d:write tty failled: %d.", __FILE__, __LINE__,
errno);
}
/* for debug */
#if 0
int i = 0;
applog(LOG_DEBUG, "uart %s send:", path);
for(i = 0; i < 5; i++)
{
applog(LOG_DEBUG, "%02X,", buf[i]);
}
applog(LOG_DEBUG, "");
#endif
close(tty_fd);
return;
}
#if 0
#ifdef SYSTEM_LINUX
static void hub_hardware_init(void)
{
int fd = 0;
int i = 0;
int iMax = sizeof(s_dev_list) / sizeof(s_dev_list[0]);
close(fd);
}
#endif
#endif
void hub_init(void)
{
hub_hardware_init();
}
void hub_deinit(void)
{
hub_hardware_deinit();
}
#define INDEX_SPI 0
#define INDEX_PERIPHERAL 1
#define INDEX_SHA256 2
// for peripheral ip
void Xil_Peripheral_Out32(uint32_t phyaddr, uint32_t val)
{
uint32_t pgoffset = phyaddr & ((uint32_t)
(s_dev_list[INDEX_PERIPHERAL].mem_size -1));
pgoffset = phyaddr;
#ifdef SYSTEM_LINUX
// for software team
*(volatile uint32_t *)(s_dev_list[INDEX_PERIPHERAL].vir_base + pgoffset) =
val;
#else
// for digit team
*(volatile uint32_t *)(s_dev_list[INDEX_PERIPHERAL].phy_addr + pgoffset) =
val;
#endif
}
#ifdef SYSTEM_LINUX
// for software team
val = *(volatile uint32_t *)(s_dev_list[INDEX_PERIPHERAL].vir_base +
pgoffset);
#else
// for digit team
val = *(volatile uint32_t *)(s_dev_list[INDEX_PERIPHERAL].phy_addr +
pgoffset);
#endif
return val;
}
// for spi ip
void Xil_SPI_Out32(uint32_t phyaddr, uint32_t val)
{
uint32_t pgoffset = phyaddr & ((uint32_t)(s_dev_list[INDEX_SPI].mem_size -
1));
#ifdef SYSTEM_LINUX
// for software team
*(volatile uint32_t *)(s_dev_list[INDEX_SPI].vir_base + pgoffset) = val;
#else
// for digit team
*(volatile uint32_t *)(s_dev_list[INDEX_SPI].phy_addr + pgoffset) = val;
#endif
}
#ifdef SYSTEM_LINUX
// for software team
val = *(volatile uint32_t *)(s_dev_list[INDEX_SPI].vir_base + pgoffset);
#else
// for digit team
val = *(volatile uint32_t *)(s_dev_list[INDEX_SPI].phy_addr + pgoffset);
#endif
return val;
}
if (mode == LED_ON){
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << spi_id)) ) | ((LED_ON & 0x1) << spi_id));
}
else if (mode == LED_OFF){
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << spi_id)) ) | ((LED_OFF & 0x1) << spi_id));
}
else if (mode == LED_BLING_ON){
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << spi_id)) ) | ((LED_OFF & 0x1) << spi_id));
cgsleep_us(led_delay*1000);
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << spi_id)) ) | ((LED_ON & 0x1) << spi_id));
cgsleep_us(led_delay*1000);
}
else if (mode == LED_BLING_OFF){
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << spi_id)) ) | ((LED_ON & 0x1) << spi_id));
cgsleep_us(led_delay*1000);
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << spi_id)) ) | ((LED_OFF & 0x1) << spi_id));
cgsleep_us(led_delay*1000);
}
}
// ---------------------------------------------------------------------------
// For check status
// ---------------------------------------------------------------------------
cmd_status = Xil_SPI_In32(SPI_BASEADDR_GAP*spi_id+CMD_CTRL_REG2_ADDR);
if (cmd_status & 0x00000004){
return XST_CRC_ERROR;
}
return XST_SUCCESS;
}
cmd_status = Xil_SPI_In32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG1_ADDR);
write_data = cmd_status & (~0x00000004);
Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG1_ADDR, write_data);
cgsleep_ms(1);
write_data = cmd_status | 0x00000004;
Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG1_ADDR, write_data);
}
// ---------------------------------------------------------------------------
// Below function is for new SPI design's nonce/receive queue
// ---------------------------------------------------------------------------
void read_rx_buffer(uint8_t spi_id, uint8_t* buf8, uint32_t len_cfg)
{
uint32_t i;
uint8_t rx_len;
// ---------------------------------------------------------------------------
// Below function is for new SPI design's send queue
// ---------------------------------------------------------------------------
// SPI bypass = 0
int push_one_cmd(uint8_t spi_id, uint8_t* tx_buf8, uint32_t len_cfg, uint32_t
last_job)
{
//uint32_t i;
uint8_t byte_len;
//uint32_t cmd_status;
uint16_t cmd_header;
return XST_SUCCESS;
}
/***************************************/
// interface
/***************************************/
Status = Xil_SPI_In32(SPI_RESET_REG);
// reset
Xil_SPI_Out32(SPI_RESET_REG,(Status & ~(1 << spi_id)));
cgsleep_ms(1); // usleep(1);
Status = Xil_SPI_In32(SPI_RESET_REG);
// release reset
Xil_SPI_Out32(SPI_RESET_REG,(Status | (1 << spi_id)));
Status = Xil_SPI_In32(SPI_RESET_REG);
hub_spi_reset(spi_id);
// config max chip number
Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG0_ADDR,0x00041004|
(chip_num<<24));
// config not check header
// Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+CMD_CTRL_REG3_ADDR,0x000F00FF);
Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+CMD_CTRL_REG3_ADDR, 0x000F0000 &
chip_num);
// config mask of each interrupt
Xil_SPI_Out32(MAIN_CFG_REG2_ADDR, 0x00000);
return XST_SUCCESS;
}
spi_tx[0] = CMD_RESET;
spi_tx[1] = CMD_ADDR_BROADCAST;
spi_tx[2] = 0xff;
spi_tx[3] = 0xff;
hub_spi_reset(spi_id);
}
read_data = Xil_SPI_In32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG0_ADDR);
Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG0_ADDR,
(read_data&0xFF00FFFF)|cfg[select]);
read_data = Xil_SPI_In32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG0_ADDR);
}
// usleep(100);
return XST_SUCCESS;
}
// change ext_zero to 0
cfg_reg0 = Xil_SPI_In32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG0_ADDR);
Xil_SPI_Out32(SPI_BASEADDR_GAP*spi_id+MAIN_CFG_REG0_ADDR,
(cfg_reg0&0xFFFFFF00));
return XST_SUCCESS;
return false;
}
return false;
}
cmd_status = Xil_SPI_In32(SPI_BASEADDR_GAP*spi_id+CMD_CTRL_REG2_ADDR);
if ( ((cmd_status&0x0000ff00) >= 0x00000600) && ((cmd_status&0x00000010) ==
0x00000010) ) {
return true; // wait nonce_ready = 0, cmd_done = 1
}
return false;
}
return XST_SUCCESS;
}
return XST_SUCCESS;
}
return XST_SUCCESS;
}
if (misc_get_vid_type() == MCOMPAT_LIB_VID_I2C_TYPE) {
hub_set_power_en_i2c(chain_id, value);
sleep(3);
}
reg_val = Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG8_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG8_OFFSET, (reg_val &
(~(0x1 << (18 + chain_id)))) | ((value & 0x1) << (18 + chain_id)));
//reg_val = Xil_In32(XPAR_VID_LED_BUZZER_CTRL_0_S00_AXI_BASEADDR +
VID_LED_BUZZER_CTRL_S00_AXI_SLV_REG0_OFFSET + chain_id*4);
//Xil_Peripheral_Out32(XPAR_VID_LED_BUZZER_CTRL_0_S00_AXI_BASEADDR +
VID_LED_BUZZER_CTRL_S00_AXI_SLV_REG0_OFFSET + chain_id*4, (reg_val & 0xfffeffff) |
((value & 0x1) << 16));
}
reg_val = Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG8_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG8_OFFSET, (reg_val &
(~(0x1 << chain_id))) | ((value & 0x1) << chain_id));
//reg_val = Xil_In32(XPAR_VID_LED_BUZZER_CTRL_0_S00_AXI_BASEADDR +
VID_LED_BUZZER_CTRL_S00_AXI_SLV_REG0_OFFSET + chain_id*4);
//Xil_Peripheral_Out32(XPAR_VID_LED_BUZZER_CTRL_0_S00_AXI_BASEADDR +
VID_LED_BUZZER_CTRL_S00_AXI_SLV_REG0_OFFSET + chain_id*4, (reg_val & 0xfffbffff) |
((value & 0x1) << 18));
}
reg_val = Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG8_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG8_OFFSET, (reg_val &
(~(0x1 << (9 + chain_id)))) | ((value & 0x1) << (9 + chain_id)));
//reg_val = Xil_Peripheral_In32(XPAR_VID_LED_BUZZER_CTRL_0_S00_AXI_BASEADDR +
VID_LED_BUZZER_CTRL_S00_AXI_SLV_REG0_OFFSET + chain_id*4);
//Xil_Peripheral_Out32(XPAR_VID_LED_BUZZER_CTRL_0_S00_AXI_BASEADDR +
VID_LED_BUZZER_CTRL_S00_AXI_SLV_REG0_OFFSET + chain_id*4, (reg_val & 0xfffdffff) |
((value & 0x1) << 17));
return true;
}
if (mode == LED_ON){
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << chain_id)) ) | ((LED_ON & 0x1) << chain_id));
}
else if (mode == LED_OFF){
reg_val =
Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,
(reg_val & (0xffffffff ^ ( 1 << chain_id)) ) | ((LED_OFF & 0x1) << chain_id));
}
}
#ifdef SYSTEM_LINUX
static int set_warn(int spi_id)
{
mcompat_set_power_en(spi_id, 0);
sleep(1);
mcompat_set_reset(spi_id, 0);
mcompat_set_start_en(spi_id, 0);
do
{
mcompat_set_led(spi_id, 1);
sleep(1);
mcompat_set_led(spi_id, 0);
sleep(1);
}while(1);
return 0;
}
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP*chain_id+AUTO_CMD0A_REG3_ADDR);
tmp_val = ((reg_val >> 10) & 0x3ff) < g_temp_hi_thr ? 0x0:((reg_val >> 10) &
0x3ff);
tmp_val = tmp_val > g_temp_lo_thr ? 0x0:tmp_val;
temp_ctrl->temp_highest[1] = tmp_val;
tmp_val = ((reg_val >> 20) & 0x3ff) < g_temp_hi_thr ? 0x0:((reg_val >> 20) &
0x3ff);
tmp_val = tmp_val > g_temp_lo_thr ? 0x0:tmp_val;
temp_ctrl->temp_highest[2] = (reg_val >> 20 ) & 0x3ff;
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP*chain_id+AUTO_CMD0A_REG2_ADDR);
tmp_val = ((reg_val >> 10) & 0x3ff) < g_temp_hi_thr ? 0x0:((reg_val >> 10) &
0x3ff);
tmp_val = tmp_val > g_temp_lo_thr ? 0x0:tmp_val;
temp_ctrl->temp_lowest[1] = tmp_val;
tmp_val = ((reg_val >> 20) & 0x3ff) < g_temp_hi_thr ? 0x0:((reg_val >> 20) &
0x3ff);
tmp_val = tmp_val > g_temp_lo_thr ? 0x0:tmp_val;
temp_ctrl->temp_lowest[2] = tmp_val;
applog(LOG_INFO,"chain %d,lo: %d,%d,%d",chain_id,temp_ctrl-
>temp_lowest[0],temp_ctrl->temp_lowest[1],temp_ctrl->temp_lowest[2]);
}
reg_val = Xil_SPI_In32(SPI_BASEADDR_GAP*chain_id+AUTO_CMD0A_REG4_ADDR);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG32_OFFSET, 25000);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG33_OFFSET,
(vid_binary[3] << 28) | (vid_binary[2] << 24) | (vid_binary[1] << 20) |
(vid_binary[0] << 16) | 0xff);
reg_val = 0;
for(i = 0; i < 8; i ++)
{
reg_val = (vid_binary[i+4] << (i*4)) | reg_val;
}
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG34_OFFSET, reg_val);
reg_val = 0;
for(i = 0; i < 4; i ++)
{
reg_val = (vid_binary[i+12] << (i*4)) | reg_val;
}
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG35_OFFSET, reg_val);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG39_OFFSET, 80 | (4 <<
16));
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG4_OFFSET, 0x1 <<
chain_id);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG3_OFFSET, 0x1 );
cgsleep_ms(100);
}
value = Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG16_OFFSET +
fan_id*8);
value = value | (1<<fan_id);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG2_OFFSET, value);
//Xil_Fans_Out32(XPAR_FANS_CTRL_0_S00_AXI_BASEADDR +
FANS_CTRL_S00_AXI_SLV_REG1_OFFSET + fan_id*8, frequency);
//Xil_Fans_Out32(XPAR_FANS_CTRL_0_S00_AXI_BASEADDR +
FANS_CTRL_S00_AXI_SLV_REG0_OFFSET + fan_id*8, duty_driver | (0x1 << 31));
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG16_OFFSET + fan_id*8,
frequency);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG17_OFFSET + fan_id*8,
duty_driver | (0x1 << 31));
#else
int duty_driver = 0;
uint32_t reg_val;
duty_driver = frequency / 100 * duty;
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG16_OFFSET + fan_id*8,
frequency);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG17_OFFSET + fan_id*8,
duty_driver);
reg_val = Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG2_OFFSET);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG2_OFFSET, (reg_val &
(~(0x1 << fan_id))) | (0x1 << fan_id));
#endif
}
int hub_get_button(void)
{
uint32_t reg_val;
reg_val = Xil_Peripheral_In32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG10_OFFSET);
return (((reg_val >> 16) & 0x1));
}
if (LED_ON == mode)
{
SetRedRegValue = reg_val | 0x200;
}
else
{
SetRedRegValue = reg_val & (~0x200);
}
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,SetRedRegValue);
}
if (LED_ON == mode)
{
SetRedRegValue = reg_val | 0x400;
}
else
{
SetRedRegValue = reg_val & (~0x400);
}
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG9_OFFSET,SetRedRegValue);
}
void init_hub_gpio(void)
{
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG1_OFFSET, 0);
sleep(1);
Xil_Peripheral_Out32(MCOMPAT_PERIPHERAL_S00_AXI_SLV_REG1_OFFSET, 3);
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
if (rxbuf == NULL)
{
applog(LOG_ERR, "%s,%s() %d: para erro! ", __FILE__, __func__,
__LINE__);
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
if (txbuf == NULL)
{
ret = opi_spi_transfer(chain_id, NULL, spi_rx, len16);
}
else
{
for(i = 0; i < len16; i++)
{
spi_tx[i] = OPI_MAKE_WORD(txbuf[2*i], txbuf[(2*i)+1]);
}
if (!ret)
{
return false;
}
return true;
}
if (buff == NULL)
{
applog(LOG_ERR, "%s,%s() %d: para erro! ", __FILE__, __func__,
__LINE__);
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = OPI_HI_BYTE(AX_CMD_SYNC_HEAD);
spi_tx[1] = OPI_LO_BYTE(AX_CMD_SYNC_HEAD);
spi_tx[2] = cmd;
spi_tx[3] = chip_id;
if (len > 0)
{
memcpy(spi_tx + 4, buff, len);
}
if (buff == NULL)
{
applog(LOG_ERR, "%s,%s() %d: para erro! ", __FILE__, __func__,
__LINE__);
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
tx_len = g_chip_num * 4;
if (i >= tx_len)
{
applog(LOG_ERR, "%s,%d: poll fail !", __FILE__, __LINE__);
return false;
}
if (len > 0)
{
opi_spi_read_write(chain_id, NULL, spi_rx+2, len);
}
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = OPI_HI_BYTE(CUSTOM_SYNC_HEAD);
spi_tx[1] = OPI_LO_BYTE(CUSTOM_SYNC_HEAD);
spi_tx[2] = cmd;
spi_tx[3] = 0;
if (len > 0)
{
memcpy(spi_tx + 4, buff, len);
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
tx_len = g_chip_num * 4;
if (i >= tx_len)
{
applog(LOG_ERR, "%s,%d: poll fail !", __FILE__, __LINE__);
return false;
}
if (len > 0)
{
opi_spi_read_write(chain_id, NULL, spi_rx+2, len);
memcpy(buff, spi_rx+2, len);
}
return true;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!opi_poll_rslt(chain_id, OPI_SET_LED, rx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return -1;
}
return (int)(rx_buf[0]);
}
tx_buf[0] = fan_id;
tx_buf[1] = 0x00;
return true;
}
bool opi_chain_power_down(unsigned char chain_id)
{
applog(LOG_DEBUG, "%s,%d: %s ", __FILE__, __LINE__, __FUNCTION__);
return true;
}
return true;
}
bool opi_chain_power_on_all(void)
{
int i;
return true;
}
bool opi_chain_power_down_all(void)
{
int i;
for(i = 0; i < g_chain_num; i++)
{
opi_chain_power_down(i);
}
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
tx_buf[0] = cmd;
tx_buf[1] = chip_id;
if (len > 0)
{
memcpy(tx_buf + 2, buff, len);
}
return true;
}
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (i >= max_len)
{
applog(LOG_ERR, "%s,%d: poll fail !", __FILE__, __LINE__);
return false;
}
return true;
}
return true;
}
zynq_set_spi_speed(cfg[index]);
}
if (mcompat_get_plug(chain_id) != 0)
{
applog(LOG_NOTICE, "chain %d >>> the board not inserted !!!",
chain_id);
return false;
}
mcompat_set_power_en(chain_id, 1);
sleep(5);
mcompat_set_reset(chain_id, 1);
sleep(1);
mcompat_set_start_en(chain_id, 1);
return true;
}
return true;
}
return true;
}
bool zynq_chain_power_on_all(void)
{
int i;
sleep(5);
sleep(1);
return true;
}
bool zynq_chain_power_down_all(void)
{
int i;
sleep(1);
return true;
}
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_RESET;
spi_tx[1] = chip_id;
spi_tx[2] = in[0];
spi_tx[3] = in[1];
//cfg_len = 0x03000200;
cfg_len += (0x03) << 24;
cfg_len += (0x00) << 16;
cfg_len += (0x02) << 8;
cfg_len += (0x00) << 0;
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_BIST_START;
spi_tx[1] = chip_id;
//cfg_len = 0x02000200;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (0x02) << 8;
cfg_len += (0x00) << 0;
return spi_rx[3];;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_BIST_COLLECT;
spi_tx[1] = chip_id;
//cfg_len = 0x02000200;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (0x02) << 8;
cfg_len += (0x00) << 0;
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_BIST_FIX;
spi_tx[1] = chip_id;
//cfg_len = 0x02000200;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (0x02) << 8;
cfg_len += (0x00) << 0;
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_WRITE_REG;
spi_tx[1] = chip_id;
memcpy(spi_tx + 2, reg, len);
//cfg_len = 0x09070807;
cfg_len += (((len / 2) + 2) & 0xff) << 24;
cfg_len += (((len / 2) + 1) & 0xff) << 16;
cfg_len += (((len / 2) + 2) & 0xff) << 8;
cfg_len += (((len / 2) + 1) & 0xff) << 0;
if (do_spi_cmd(chain_id, spi_tx, spi_rx, cfg_len) == XST_FAILURE)
{
return false;
}
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_READ_REG;
spi_tx[1] = chip_id;
//cfg_len = 0x02000807;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (((len / 2) + 2) & 0xff) << 8;
cfg_len += (((len / 2) + 1) & 0xff) << 0;
if (crc1 != crc2) {
applog(LOG_WARNING, "%s crc error !", __FUNCTION__);
return false;
}
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_WRITE_REG0d;
spi_tx[1] = chip_id;
memcpy(spi_tx + 2, in, len);
//cfg_len = 0x09070807;
cfg_len += (((len / 2) + 2) & 0xff) << 24;
cfg_len += (((len / 2) + 1) & 0xff) << 16;
cfg_len += (((len / 2) + 2) & 0xff) << 8;
cfg_len += (((len / 2) + 1) & 0xff) << 0;
if (crc1 != crc2) {
applog(LOG_WARNING, "%s crc error !", __FUNCTION__);
return false;
}
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
spi_tx[0] = CMD_READ_RESULT;
spi_tx[1] = chip_id;
// cfg_len = 0x02000605;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (((len / 2) + 3) & 0xff) << 8;
cfg_len += (((len / 2) + 2) & 0xff) << 0;
if (spi_rx[1] == 0)
return false;
if (crc1 != crc2) {
applog(LOG_WARNING, "%s crc error !", __FUNCTION__);
return false;
}
return true;
}
// cfg_len = 0x02000605;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (((len / 2) + 3) & 0xff) << 8;
cfg_len += (((len / 2) + 2) & 0xff) << 0;
if (mode == 0)
disable_auto_nonce(chain_id);
else
enable_auto_nonce(chain_id, cmd08, cfg_len);
return true;
}
memset(spi_tx, 0, sizeof(spi_tx));
memset(spi_rx, 0, sizeof(spi_rx));
// cfg_len = 0x02000605;
cfg_len += (0x02) << 24;
cfg_len += (0x00) << 16;
cfg_len += (((len / 2) + 3) & 0xff) << 8;
cfg_len += (((len / 2) + 2) & 0xff) << 0;
if (!rece_queue_has_nonce(chain_id, 1000))
return false;
if (spi_rx[1] == 0)
return false;
return true;
}
if (hub_get_plug(chain_id))
return false;
enable_auto_cmd0a(chain_id,g_dangerous_temp,33,24,0,0);
mcompat_temp_s *temp_ctrl = &fan_temp_ctrl->mcompat_temp[chain_id];
do{
val = Xil_SPI_In32(SPI_AXIBASE +
SPI_BASEADDR_GAP*chain_id+AUTO_CMD0A_REG4_ADDR);
}while(!((val >> 24) & 0x1));
hub_get_hitemp_stat(chain_id,temp_ctrl);
hub_get_lotemp_stat(chain_id,temp_ctrl);
hub_get_avgtemp_stat(chain_id,temp_ctrl);
disable_auto_cmd0a(chain_id,g_dangerous_temp,33,24,0,0);
return true;
}
bool init_opi_cmd(void)
{
opi_spi_init();
return true;
}
bool exit_opi_cmd(void)
{
opi_spi_exit();
return true;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!opi_poll_result(chain_id, CMD_RESET, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!opi_send_command(chain_id, CMD_BIST_START, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s send fail !", __FILE__, __LINE__,
__FUNCTION__);
return -1;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!opi_poll_result(chain_id, CMD_BIST_START, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return -1;
}
return rx_buf[3];
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!opi_send_command(chain_id, CMD_BIST_COLLECT, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s send fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!opi_poll_result(chain_id, CMD_BIST_COLLECT, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!opi_send_command(chain_id, CMD_BIST_FIX, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s send fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!opi_poll_result(chain_id, CMD_BIST_FIX, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
if (reg == NULL)
{
applog(LOG_ERR, "%s,%d: %s para error !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
memset(tx_buf, 0, sizeof(tx_buf));
tx_buf[0] = OPI_HI_BYTE(AX_CMD_SYNC_HEAD);
tx_buf[1] = OPI_LO_BYTE(AX_CMD_SYNC_HEAD);
tx_buf[2] = CMD_WRITE_REG;
tx_buf[3] = chip_id;
memcpy(tx_buf + 4, reg, len);
for(i = 0; i < len + 2; i = i + 2)
{
tmp_buf[i + 0] = tx_buf[i + 1 + 2];
tmp_buf[i + 1] = tx_buf[i + 0 + 2];
}
crc = CRC16_2(tmp_buf, len + 2);
tx_buf[4 + len + 0] = (unsigned char)((crc >> 8) & 0xff);
tx_buf[4 + len + 1] = (unsigned char)((crc >> 0) & 0xff);
memset(rx_buf, 0, sizeof(rx_buf));
if (!opi_poll_result(chain_id, CMD_WRITE_REG, chip_id, rx_buf, len))
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
if (reg == NULL)
{
applog(LOG_ERR, "%s,%d: %s para error !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!opi_send_command(chain_id, CMD_READ_REG, chip_id, tx_buf, 0))
{
applog(LOG_WARNING, "%s,%d: %s send fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (i >= max_len)
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
if (crc1 != crc2)
{
applog(LOG_WARNING, "%s,%d: %s crc fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
tx_buf[0] = OPI_HI_BYTE(AX_CMD_SYNC_HEAD);
tx_buf[1] = OPI_LO_BYTE(AX_CMD_SYNC_HEAD);
tx_buf[2] = CMD_WRITE_REG0d;
tx_buf[3] = chip_id;
memcpy(tx_buf + 4, in, len);
for(i = 0; i < len + 2; i = i + 2)
{
tmp_buf[i + 0] = tx_buf[i + 1 + 2];
tmp_buf[i + 1] = tx_buf[i + 0 + 2];
}
crc = CRC16_2(tmp_buf, len + 2);
tx_buf[4 + len + 0] = (unsigned char)((crc >> 8) & 0xff);
tx_buf[4 + len + 1] = (unsigned char)((crc >> 0) & 0xff);
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (i >= max_len)
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
if (crc1 != crc2)
{
applog(LOG_WARNING, "%s,%d: %s crc fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
if (res == NULL)
{
applog(LOG_ERR, "%s,%d: %s para error !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!opi_send_command(chain_id, CMD_READ_RESULT, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s,%d: %s send fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (i >= max_len)
{
applog(LOG_WARNING, "%s,%d: %s poll fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
if (crc1 != crc2)
{
applog(LOG_WARNING, "%s,%d: %s crc fail !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
return true;
}
if (job == NULL)
{
applog(LOG_ERR, "%s,%d: %s para error !", __FILE__, __LINE__,
__FUNCTION__);
return false;
}
ZYNQ_SPI_T s_spi[MCOMPAT_CONFIG_MAX_CHAIN_NUM];
return true;
}
return true;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!spi_poll_result(spi, CMD_RESET, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return false;
}
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!spi_send_command(spi, CMD_BIST_START, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s send fail !", __FUNCTION__);
return -1;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!spi_poll_result(spi, CMD_BIST_START, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return -1;
}
return rx_buf[3];
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!spi_send_command(spi, CMD_BIST_COLLECT, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s send fail !", __FUNCTION__);
return false;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!spi_poll_result(spi, CMD_BIST_COLLECT, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return false;
}
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!spi_send_command(spi, CMD_BIST_FIX, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s send fail !", __FUNCTION__);
return false;
}
memset(rx_buf, 0, sizeof(rx_buf));
if (!spi_poll_result(spi, CMD_BIST_FIX, chip_id, rx_buf, 2))
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return false;
}
return true;
}
if (reg == NULL)
{
applog(LOG_ERR, "%s para error !", __FUNCTION__);
return false;
}
memset(tx_buf, 0, sizeof(tx_buf));
tx_buf[0] = CMD_WRITE_REG;
tx_buf[1] = chip_id;
memcpy(tx_buf + 2, reg, len);
for(i = 0; i < len + 2; i = i + 2)
{
tmp_buf[i + 0] = tx_buf[i + 1];
tmp_buf[i + 1] = tx_buf[i + 0];
}
crc = CRC16_2(tmp_buf, len + 2);
tx_buf[2 + len + 0] = (unsigned char)((crc >> 8) & 0xff);
tx_buf[2 + len + 1] = (unsigned char)((crc >> 0) & 0xff);
memset(rx_buf, 0, sizeof(rx_buf));
if (!spi_poll_result(spi, CMD_WRITE_REG, chip_id, rx_buf, len))
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return false;
}
return true;
}
bool spi_cmd_read_register(unsigned char chain_id, unsigned char chip_id, unsigned
char *reg, int len)
{
int i;
int max_len;
unsigned short crc1, crc2;
ZYNQ_SPI_T *spi = &s_spi[chain_id];
unsigned char tx_buf[MCOMPAT_CONFIG_MAX_CMD_LENGTH];
unsigned char rx_buf[MCOMPAT_CONFIG_MAX_CMD_LENGTH];
unsigned char tmp_buf[MCOMPAT_CONFIG_MAX_CMD_LENGTH];
if (reg == NULL)
{
applog(LOG_ERR, "%s para error !", __FUNCTION__);
return false;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!spi_send_command(spi, CMD_READ_REG, chip_id, tx_buf, 0))
{
applog(LOG_WARNING, "%s send fail !", __FUNCTION__);
return false;
}
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (i >= max_len)
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return false;
}
if (crc1 != crc2) {
applog(LOG_WARNING, "%s crc error !", __FUNCTION__);
return false;
}
memcpy(reg, rx_buf + 2, len);
return true;
}
memset(tx_buf, 0, sizeof(tx_buf));
tx_buf[0] = CMD_WRITE_REG0d;
tx_buf[1] = chip_id;
memcpy(tx_buf + 2, in, len);
for(i = 0; i < len + 2; i = i + 2)
{
tmp_buf[i + 0] = tx_buf[i + 1];
tmp_buf[i + 1] = tx_buf[i + 0];
}
crc = CRC16_2(tmp_buf, len + 2);
tx_buf[2 + len + 0] = (unsigned char)((crc >> 8) & 0xff);
tx_buf[2 + len + 1] = (unsigned char)((crc >> 0) & 0xff);
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (i >= max_len)
{
applog(LOG_WARNING, "%s poll fail !", __FUNCTION__);
return false;
}
spi_recv_data_in_word(spi, rx_buf + 2, len + 2);
if (crc1 != crc2) {
applog(LOG_WARNING, "%s crc error !", __FUNCTION__);
return false;
}
return true;
}
if (res == NULL)
{
applog(LOG_ERR, "%s para error !", __FUNCTION__);
return false;
}
memset(tx_buf, 0, sizeof(tx_buf));
if (!spi_send_command(spi, CMD_READ_RESULT, chip_id, tx_buf, 2))
{
applog(LOG_WARNING, "%s send fail !", __FUNCTION__);
return false;
}
max_len = g_chip_num * 4;
memset(rx_buf, 0, sizeof(rx_buf));
if (crc1 != crc2) {
applog(LOG_WARNING, "%s crc error !", __FUNCTION__);
return false;
}
return true;
}
if (job == NULL)
{
applog(LOG_ERR, "%s para error !", __FUNCTION__);
return false;
}
return true;
}
return wCRC;
}
if ((len % 16) != 0)
{
//printf("");
}
}
/
***********************************************************************************
********
* GPIO
***********************************************************************************
********/
int gpio_init(void)
{
int fd;
unsigned int addr_start, addr_offset, PageSize, PageMask;
void *pc;
fd = open("/dev/mem", O_RDWR);
if (fd < 0)
return -1;
PageSize = sysconf(_SC_PAGESIZE);
PageMask = (~(PageSize - 1));
close(fd);
return 0;
}
if (SUNXI_IO_BASE == 0)
return -1;
return 0;
}
if (SUNXI_IO_BASE == 0)
return -0;
if (SUNXI_IO_BASE == 0)
return -1;
struct sunxi_gpio *pio = &((struct sunxi_gpio_reg *) SUNXI_IO_BASE)-
>gpio_bank[bank];
if (p1)
*(&pio->dat) |= 1 << num;
else
*(&pio->dat) &= ~(1 << num);
return 0;
}
if (SUNXI_IO_BASE == 0)
return -1;
return 0;
}
if (SUNXI_IO_BASE == 0)
return -1;
dat = *(&pio->dat);
dat >>= num;
/
***********************************************************************************
********
* I2C
***********************************************************************************
********/
int i2c_open(char *dev, uint8_t address)
{
int fd;
int ret;
fd = open(dev, O_RDWR);
if (fd < 0)
return fd;
return fd;
}
/
***********************************************************************************
********
* spi
***********************************************************************************
********/
int spi_open(char *dev, spi_config_t config)
{
int fd;
fd = open(dev, O_RDWR);
if (fd < 0)
return fd;
return fd;
}
int spi_xfer(int fd, uint8_t *tx_buf, uint8_t tx_len, uint8_t *rx_buf, uint8_t
rx_len)
{
struct spi_ioc_transfer spi_message[2];
memset(spi_message, 0, sizeof(spi_message));
/
***********************************************************************************
********
* time
***********************************************************************************
********/
void delay(unsigned int howLong)
{
struct timespec sleeper, dummy ;
void opi_spi_gpio_init(void)
{
if (gpio_init() == -1) {
printf("gpio initial fail");
}
gpio_setcfg(PIN_SPI_E1, OUTPUT);
gpio_output(PIN_SPI_E1, HIGH);
gpio_setcfg(PIN_SPI_A0, OUTPUT);
gpio_output(PIN_SPI_A0, HIGH);
gpio_setcfg(PIN_SPI_A1, OUTPUT);
gpio_output(PIN_SPI_A1, HIGH);
gpio_setcfg(PIN_SPI_A2, OUTPUT);
gpio_output(PIN_SPI_A2, HIGH);
}
gpio_output(PIN_SPI_E1, LOW);
}
void opi_spi_cs_disable(void)
{
gpio_output(PIN_SPI_E1, HIGH);
}
void opi_spi_init(void)
{
char dev_fname[PATH_MAX];
struct spi_config *config = &opi_spi_config;
pthread_mutex_init(&opi_spi_lock, NULL);
opi_spi_gpio_init();
opi_spi_fd = fd;
void opi_spi_exit(void)
{
close(opi_spi_fd);
}
/*
* void opi_set_spi_speed(uint32_t speed)
* {
* pthread_mutex_lock(&opi_spi_lock);
*
* if ((ioctl(opi_spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, speed) < 0) ||
* (ioctl(opi_spi_fd, SPI_IOC_RD_MAX_SPEED_HZ, speed) < 0)) {
* applog(LOG_ERR, "SPI: ioctl error on SPI device");
* }
*
* opi_spi_config.speed = speed;
*
* pthread_mutex_unlock(&opi_spi_lock);
* }
*/
bool opi_spi_transfer(uint8_t id, uint16_t *txbuf, uint16_t *rxbuf, int len)
{
struct spi_ioc_transfer xfr;
int ret;
if (rxbuf != NULL) {
memset(rxbuf, 0xff, len);
}
pthread_mutex_lock(&opi_spi_lock);
opi_spi_cs_enable(id);
cgsleep_ms(1); // usleep(1);
ret = len;
cgsleep_ms(1); // usleep(1);
opi_spi_cs_disable();
pthread_mutex_unlock(&opi_spi_lock);
int g_platform;
int g_miner_type;
int g_chain_num;
int g_chip_num;
g_platform = platform;
g_miner_type = miner_type;
g_chain_num = chain_num;
g_chip_num = chip_num;
init_mcompat_cmd();
init_mcompat_gpio();
init_mcompat_pwm();
init_mcompat_chain();
return true;
}
bool sys_platform_exit(void)
{
exit_mcompat_cmd();
exit_mcompat_gpio();
exit_mcompat_pwm();
exit_mcompat_chain();
return true;
}