operacake: create struct for operacake state
This commit is contained in:
@ -71,17 +71,15 @@
|
|||||||
#define OPERACAKE_ADDRESS_DEFAULT 0x18
|
#define OPERACAKE_ADDRESS_DEFAULT 0x18
|
||||||
#define OPERACAKE_ADDRESS_INVALID 0xFF
|
#define OPERACAKE_ADDRESS_INVALID 0xFF
|
||||||
|
|
||||||
|
#define OPERACAKE_MAX_BOARDS 8
|
||||||
|
|
||||||
i2c_bus_t* const oc_bus = &i2c0;
|
i2c_bus_t* const oc_bus = &i2c0;
|
||||||
uint8_t operacake_boards[8] = {
|
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
struct operacake_state {
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
bool present;
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
|
||||||
OPERACAKE_ADDRESS_INVALID,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct operacake_state operacake_boards[OPERACAKE_MAX_BOARDS];
|
||||||
bool allow_gpio_mode = true;
|
bool allow_gpio_mode = true;
|
||||||
|
|
||||||
/* read single register */
|
/* read single register */
|
||||||
@ -105,21 +103,38 @@ void operacake_write_reg(i2c_bus_t* const bus, uint8_t address, uint8_t reg, uin
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t operacake_init(bool allow_gpio) {
|
uint8_t operacake_init(bool allow_gpio) {
|
||||||
uint8_t reg, addr, j = 0;
|
|
||||||
/* Find connected operacakes */
|
/* Find connected operacakes */
|
||||||
for(addr=0; addr<8; addr++) {
|
for (int addr = 0; addr < 8; addr++) {
|
||||||
operacake_write_reg(oc_bus, addr, OPERACAKE_REG_OUTPUT,
|
operacake_write_reg(oc_bus, addr, OPERACAKE_REG_OUTPUT,
|
||||||
OPERACAKE_DEFAULT_OUTPUT);
|
OPERACAKE_DEFAULT_OUTPUT);
|
||||||
operacake_write_reg(oc_bus, addr, OPERACAKE_REG_CONFIG,
|
operacake_write_reg(oc_bus, addr, OPERACAKE_REG_CONFIG,
|
||||||
OPERACAKE_CONFIG_ALL_OUTPUT);
|
OPERACAKE_CONFIG_ALL_OUTPUT);
|
||||||
reg = operacake_read_reg(oc_bus, addr, OPERACAKE_REG_CONFIG);
|
uint8_t reg = operacake_read_reg(oc_bus, addr, OPERACAKE_REG_CONFIG);
|
||||||
if(reg==OPERACAKE_CONFIG_ALL_OUTPUT)
|
|
||||||
operacake_boards[j++] = addr;
|
operacake_boards[addr].present = (reg == OPERACAKE_CONFIG_ALL_OUTPUT);
|
||||||
}
|
}
|
||||||
allow_gpio_mode = allow_gpio;
|
allow_gpio_mode = allow_gpio;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool operacake_is_board_present(uint8_t address) {
|
||||||
|
if (address >= OPERACAKE_MAX_BOARDS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return operacake_boards[address].present;
|
||||||
|
}
|
||||||
|
|
||||||
|
void operacake_get_boards(uint8_t *addresses) {
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < OPERACAKE_MAX_BOARDS; i++) {
|
||||||
|
addresses[i] = OPERACAKE_ADDRESS_INVALID;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < OPERACAKE_MAX_BOARDS; i++) {
|
||||||
|
if (operacake_is_board_present(i))
|
||||||
|
addresses[count++] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t port_to_pins(uint8_t port) {
|
uint8_t port_to_pins(uint8_t port) {
|
||||||
switch(port) {
|
switch(port) {
|
||||||
case OPERACAKE_PA1:
|
case OPERACAKE_PA1:
|
||||||
@ -221,7 +236,13 @@ uint8_t operacake_set_range(uint32_t freq_mhz) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
operacake_set_ports(operacake_boards[0], ranges[i].portA, ranges[i].portB);
|
for (i = 0; i < OPERACAKE_MAX_BOARDS; i++) {
|
||||||
|
if (operacake_is_board_present(i)) {
|
||||||
|
operacake_set_ports(i, ranges[i].portA, ranges[i].portB);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
current_range = i;
|
current_range = i;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -42,10 +42,9 @@ extern "C"
|
|||||||
|
|
||||||
#define MAX_OPERACAKE_RANGES 8
|
#define MAX_OPERACAKE_RANGES 8
|
||||||
|
|
||||||
/* Up to 8 Operacake boards can be used with one HackRF */
|
|
||||||
extern uint8_t operacake_boards[8];
|
|
||||||
|
|
||||||
uint8_t operacake_init(bool allow_gpio);
|
uint8_t operacake_init(bool allow_gpio);
|
||||||
|
bool operacake_is_board_present(uint8_t address);
|
||||||
|
void operacake_get_boards(uint8_t *addresses);
|
||||||
uint8_t operacake_set_ports(uint8_t address, uint8_t PA, uint8_t PB);
|
uint8_t operacake_set_ports(uint8_t address, uint8_t PA, uint8_t PB);
|
||||||
uint8_t operacake_add_range(uint16_t freq_min, uint16_t freq_max, uint8_t port);
|
uint8_t operacake_add_range(uint16_t freq_min, uint16_t freq_max, uint8_t port);
|
||||||
uint8_t operacake_set_range(uint32_t freq_mhz);
|
uint8_t operacake_set_range(uint32_t freq_mhz);
|
||||||
|
@ -29,7 +29,9 @@ usb_request_status_t usb_vendor_request_operacake_get_boards(
|
|||||||
usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage)
|
usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage)
|
||||||
{
|
{
|
||||||
if (stage == USB_TRANSFER_STAGE_SETUP) {
|
if (stage == USB_TRANSFER_STAGE_SETUP) {
|
||||||
usb_transfer_schedule_block(endpoint->in, operacake_boards, 8, NULL, NULL);
|
uint8_t addresses[8];
|
||||||
|
operacake_get_boards(addresses);
|
||||||
|
usb_transfer_schedule_block(endpoint->in, addresses, 8, NULL, NULL);
|
||||||
usb_transfer_schedule_ack(endpoint->out);
|
usb_transfer_schedule_ack(endpoint->out);
|
||||||
}
|
}
|
||||||
return USB_REQUEST_STATUS_OK;
|
return USB_REQUEST_STATUS_OK;
|
||||||
|
Reference in New Issue
Block a user