1 Star 0 Fork 1

actionchen / cgminer

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
bf16-communication.c 7.26 KB
一键复制 编辑 原始数据 按行查看 历史
#include "bf16-communication.h"
#include "bf16-ctrldevice.h"
#include "bf16-gpiodevice.h"
#include "miner.h"
#define MSP_BUFF_SIZE 96
static device_t* spi0_device;
static device_t* spi1_device;
static device_t* uart1_device;
static device_t* uart2_device;
static device_t* ctrl_device;
static device_t* gpio_device;
/* transfer functions */
int8_t device_spi_transfer(spi_channel_id_t channel_id, uint8_t* data, int size)
{
switch (channel_id) {
case SPI_CHANNEL1:
memset(spi0_device->tx, 0, spi0_device->size);
memset(spi0_device->rx, 0, spi0_device->size);
spi0_device->datalen = size;
cg_memcpy(spi0_device->tx, data, size);
spi_transfer(spi0_device);
cg_memcpy(data, spi0_device->rx, size);
break;
case SPI_CHANNEL2:
memset(spi1_device->tx, 0, spi1_device->size);
memset(spi1_device->rx, 0, spi1_device->size);
spi1_device->datalen = size;
cg_memcpy(spi1_device->tx, data, size);
spi_transfer(spi1_device);
cg_memcpy(data, spi1_device->rx, size);
break;
}
return 0;
}
int8_t device_spi_txrx(spi_channel_id_t channel_id, uint8_t* tx, uint8_t* rx, int size)
{
switch (channel_id) {
case SPI_CHANNEL1:
memset(spi0_device->tx, 0, spi0_device->size);
memset(spi0_device->rx, 0, spi0_device->size);
spi0_device->datalen = size;
cg_memcpy(spi0_device->tx, tx, size);
spi_transfer(spi0_device);
cg_memcpy(rx, spi0_device->rx, size);
break;
case SPI_CHANNEL2:
memset(spi1_device->tx, 0, spi1_device->size);
memset(spi1_device->rx, 0, spi1_device->size);
spi1_device->datalen = size;
cg_memcpy(spi1_device->tx, tx, size);
spi_transfer(spi1_device);
cg_memcpy(rx, spi1_device->rx, size);
break;
}
return 0;
}
static void add_crc(char* data)
{
uint8_t crc = 0;
while (*data) {
crc += *data;
data++;
}
sprintf(data, "#%d\n", crc);
}
int8_t device_uart_transfer(uart_channel_id_t channel_id, char* cmd)
{
uint8_t buff[MSP_BUFF_SIZE];
memset(buff, 0, MSP_BUFF_SIZE);
uint16_t cmdlen = strlen(cmd);
if (cmdlen > 0) {
(cmdlen == 1) ? sprintf((char *)buff, "%s:", cmd) : sprintf((char *)buff, "%s", cmd);
add_crc((char *)buff);
}
switch (channel_id) {
case UART_CHANNEL1:
memset(uart1_device->tx, 0, uart1_device->size);
memset(uart1_device->rx, 0, uart1_device->size);
uart1_device->datalen = strlen((char *)buff);
cg_memcpy(uart1_device->tx, buff, uart1_device->datalen);
return uart_transfer(uart1_device);
break;
case UART_CHANNEL2:
memset(uart2_device->tx, 0, uart2_device->size);
memset(uart2_device->rx, 0, uart2_device->size);
uart2_device->datalen = strlen((char *)buff);
cg_memcpy(uart2_device->tx, buff, uart2_device->datalen);
return uart_transfer(uart2_device);
break;
}
return 0;
}
int16_t device_uart_txrx(uart_channel_id_t channel_id, char* cmd, char* data)
{
uint8_t buff[MSP_BUFF_SIZE];
memset(buff, 0, MSP_BUFF_SIZE);
uint16_t cmdlen = strlen(cmd);
if (cmdlen > 0) {
(cmdlen == 1) ? sprintf((char *)buff, "%s:", cmd) : sprintf((char *)buff, "%s", cmd);
add_crc((char *)buff);
}
switch (channel_id) {
case UART_CHANNEL1:
memset(uart1_device->tx, 0, uart1_device->size);
memset(uart1_device->rx, 0, uart1_device->size);
uart1_device->datalen = strlen((char *)buff);
cg_memcpy(uart1_device->tx, buff, uart1_device->datalen);
if (uart_transfer(uart1_device) < 0)
return -1;
cg_memcpy(data, uart1_device->rx, uart1_device->datalen);
return uart1_device->datalen;
break;
case UART_CHANNEL2:
memset(uart2_device->tx, 0, uart2_device->size);
memset(uart2_device->rx, 0, uart2_device->size);
uart2_device->datalen = strlen((char *)buff);
cg_memcpy(uart2_device->tx, buff, uart2_device->datalen);
if (uart_transfer(uart2_device) < 0)
return -1;
cg_memcpy(data, uart2_device->rx, uart2_device->datalen);
return uart2_device->datalen;
break;
}
return 0;
}
int8_t device_ctrl_transfer(uint8_t channel_id, int state, int fn)
{
int8_t ret = 0;
char* cmd = get_ctrl_data(channel_id, state, fn);
memset(ctrl_device->tx, 0, ctrl_device->size);
memset(ctrl_device->rx, 0, ctrl_device->size);
ctrl_device->datalen = strlen(cmd) + 1;
cg_memcpy(ctrl_device->tx, cmd, ctrl_device->datalen);
ret = ctrl_transfer(ctrl_device);
free(cmd);
return ret;
}
int8_t device_ctrl_txrx(uint8_t channel_id, int state, int fn, char* data)
{
int8_t ret = 0;
char* cmd = get_ctrl_data(channel_id, state, fn);
memset(ctrl_device->tx, 0, ctrl_device->size);
memset(ctrl_device->rx, 0, ctrl_device->size);
ctrl_device->datalen = strlen(cmd) + 1;
cg_memcpy(ctrl_device->tx, cmd, ctrl_device->datalen);
ret = ctrl_transfer(ctrl_device);
cg_memcpy(data, ctrl_device->rx, ctrl_device->datalen);
free(cmd);
return ret;
}
/* open device functions */
int8_t open_spi_device(spi_channel_id_t channel_id)
{
switch (channel_id) {
case SPI_CHANNEL1:
if ((spi0_device = malloc(sizeof(device_t))) == NULL)
quit(1, "Failed to allocate spi_device1 memory: %s", strerror(errno));
memset(spi0_device, 0, sizeof(device_t));
return spi_init(spi0_device, channel_id, 1, SPI_SPEED, SPI_BUFFER_SIZE);
break;
case SPI_CHANNEL2:
if ((spi1_device = malloc(sizeof(device_t))) == NULL)
quit(1, "Failed to allocate spi_device2 memory: %s", strerror(errno));
memset(spi1_device, 0, sizeof(device_t));
return spi_init(spi1_device, channel_id, 1, SPI_SPEED, SPI_BUFFER_SIZE);
break;
}
return 0;
}
int8_t open_uart_device(uart_channel_id_t channel_id)
{
switch (channel_id) {
case UART_CHANNEL1:
if ((uart1_device = malloc(sizeof(device_t))) == NULL)
quit(1, "Failed to allocate uart_device1 memory: %s", strerror(errno));
memset(uart1_device, 0, sizeof(device_t));
return uart_init(uart1_device, channel_id, 0, B115200, UART_BUFFER_SIZE);
break;
case UART_CHANNEL2:
if ((uart2_device = malloc(sizeof(device_t))) == NULL)
quit(1, "Failed to allocate uart_device2 memory: %s", strerror(errno));
memset(uart2_device, 0, sizeof(device_t));
return uart_init(uart2_device, channel_id, 0, B115200, UART_BUFFER_SIZE);
break;
}
return 0;
}
int8_t open_ctrl_device(void)
{
if ((ctrl_device = malloc(sizeof(device_t))) == NULL)
quit(1, "Failed to allocate ctrl_device memory: %s", strerror(errno));
memset(ctrl_device, 0, sizeof(device_t));
if ((gpio_device = malloc(sizeof(device_t))) == NULL)
quit(1, "Failed to allocate gpio_device memory: %s", strerror(errno));
memset(gpio_device, 0, sizeof(device_t));
if (gpio_init(gpio_device, gpio_device_name, GPIO_BUFFER_SIZE) < 0)
quit(1, "Failed to open [%s] device in open_ctrl_device", gpio_device_name);
applog(LOG_INFO, "BF16: opened [%s] device", gpio_device_name);
return ctrl_init(ctrl_device, ctrl_device_name, CTRL_BUFFER_SIZE);
}
/* close device functions */
int8_t close_spi_device(spi_channel_id_t channel_id)
{
switch (channel_id) {
case SPI_CHANNEL1:
spi_release(spi0_device);
free(spi0_device);
break;
case SPI_CHANNEL2:
spi_release(spi1_device);
free(spi1_device);
break;
}
return 0;
}
int8_t close_uart_device(uart_channel_id_t channel_id)
{
switch (channel_id) {
case UART_CHANNEL1:
uart_release(uart1_device);
free(uart1_device);
break;
case UART_CHANNEL2:
uart_release(uart2_device);
free(uart2_device);
break;
}
return 0;
}
int8_t close_ctrl_device(void)
{
ctrl_release(ctrl_device);
gpio_release(gpio_device);
free(ctrl_device);
free(gpio_device);
return 0;
}
1
https://gitee.com/actionchen/cgminer.git
git@gitee.com:actionchen/cgminer.git
actionchen
cgminer
cgminer
master

搜索帮助