1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-25 17:25:20 +03:00

Moved serial_4way to new IO, added temp fix for F4 targets

This commit is contained in:
blckmn 2016-06-22 21:02:09 +10:00
parent 5d385d0019
commit f7c182bf3d
4 changed files with 49 additions and 62 deletions

View file

@ -147,7 +147,8 @@ static void usbVcpBeginWrite(serialPort_t *instance)
port->buffering = true;
}
uint8_t usbTxBytesFree() {
uint8_t usbTxBytesFree()
{
// Because we block upon transmit and don't buffer bytes, our "buffer" capacity is effectively unlimited.
return 255;
}
@ -194,6 +195,7 @@ serialPort_t *usbVcpOpen(void)
return (serialPort_t *)s;
}
uint32_t usbVcpGetBaudRate(serialPort_t *instance)
{
UNUSED(instance);

View file

@ -100,43 +100,32 @@ static void setDisconnected(void)
bool isEscHi(uint8_t selEsc)
{
return (digitalIn(escHardware[selEsc].gpio, escHardware[selEsc].pin) != Bit_RESET);
return (IORead(escHardware[selEsc].io) != Bit_RESET);
}
bool isEscLo(uint8_t selEsc)
{
return (digitalIn(escHardware[selEsc].gpio, escHardware[selEsc].pin) == Bit_RESET);
return (IORead(escHardware[selEsc].io) == Bit_RESET);
}
void setEscHi(uint8_t selEsc)
{
digitalHi(escHardware[selEsc].gpio, escHardware[selEsc].pin);
IOHi(escHardware[selEsc].io);
}
void setEscLo(uint8_t selEsc)
{
digitalLo(escHardware[selEsc].gpio, escHardware[selEsc].pin);
IOLo(escHardware[selEsc].io);
}
void setEscInput(uint8_t selEsc)
{
gpioInit(escHardware[selEsc].gpio, &escHardware[selEsc].gpio_config_INPUT);
IOConfigGPIO(escHardware[selEsc].io, IOCFG_IPU);
}
void setEscOutput(uint8_t selEsc)
{
gpioInit(escHardware[selEsc].gpio, &escHardware[selEsc].gpio_config_OUTPUT);
}
static uint32_t getPinPos(uint32_t pin)
{
for (int pinPos = 0; pinPos < 16; pinPos++) {
uint32_t pinMask = (0x1 << pinPos);
if (pin & pinMask) {
return pinPos;
}
}
return 0;
IOConfigGPIO(escHardware[selEsc].io, IOCFG_OUT_PP);
}
// Initialize 4way ESC interface
@ -151,14 +140,7 @@ int esc4wayInit(void)
for (volatile uint8_t i = 0; i < pwmOutputConfiguration->outputCount; i++) {
if ((pwmOutputConfiguration->portConfigurations[i].flags & PWM_PF_MOTOR) == PWM_PF_MOTOR) {
if(motor[pwmOutputConfiguration->portConfigurations[i].index] > 0) {
escHardware[escIdx].gpio = IO_GPIO(IOGetByTag(pwmOutputConfiguration->portConfigurations[i].timerHardware->pin));
escHardware[escIdx].pin = IO_Pin(IOGetByTag(pwmOutputConfiguration->portConfigurations[i].timerHardware->pin));
escHardware[escIdx].pinpos = getPinPos(escHardware[escIdx].pin);
escHardware[escIdx].gpio_config_INPUT.pin = escHardware[escIdx].pin;
escHardware[escIdx].gpio_config_INPUT.speed = Speed_2MHz; // see pwmOutConfig()
escHardware[escIdx].gpio_config_INPUT.mode = Mode_IPU;
escHardware[escIdx].gpio_config_OUTPUT = escHardware[escIdx].gpio_config_INPUT;
escHardware[escIdx].gpio_config_OUTPUT.mode = Mode_Out_PP;
escHardware[escIdx].io = IOGetByTag(pwmOutputConfiguration->portConfigurations[i].timerHardware->pin);
escIdx++;
}
}
@ -183,7 +165,7 @@ void esc4wayStart(void)
void esc4wayRelease(void)
{
for(int i = 0; i < escCount; i++) {
escHardware[i].gpio_config_OUTPUT.mode = Mode_AF_PP; // see pwmOutConfig()
IOConfigGPIO(escHardware[i].io, IOCFG_AF_PP); // see pwmOutConfig()
setEscOutput(i);
setEscLo(i);
}
@ -397,6 +379,10 @@ void esc4wayProcess(serialPort_t *serial)
writeByte(crcOut >> 8);
writeByte(crcOut & 0xff);
serialEndWrite(port);
#ifdef STM32F4
delay(50);
#endif
TX_LED_OFF;
}

View file

@ -17,11 +17,7 @@
*/
typedef struct {
GPIO_TypeDef* gpio;
uint16_t pinpos;
uint16_t pin;
gpio_config_t gpio_config_INPUT;
gpio_config_t gpio_config_OUTPUT;
IO_t io;
} escHardware_t;
extern uint8_t escSelected;

View file

@ -183,8 +183,8 @@ static uint16_t VCP_DataTx(uint8_t* Buf, uint32_t Len)
return USBD_OK;
}
uint8_t usbAvailable(void) {
uint8_t usbAvailable(void)
{
return (usbData.rxBufHead != usbData.rxBufTail);
}
@ -197,13 +197,12 @@ uint8_t usbAvailable(void) {
*******************************************************************************/
uint32_t CDC_Receive_DATA(uint8_t* recvBuf, uint32_t len)
{
(void)len;
uint8_t ch = 0;
uint32_t ch = 0;
if (usbAvailable()) {
recvBuf[0] = usbData.rxBuf[usbData.rxBufTail];
while (usbAvailable() && ch < len) {
recvBuf[ch] = usbData.rxBuf[usbData.rxBufTail];
usbData.rxBufTail = (usbData.rxBufTail + 1) % USB_RX_BUFSIZE;
ch=1;
ch++;
receiveLength--;
}
return ch;
@ -235,9 +234,13 @@ static uint16_t VCP_DataRx(uint8_t* Buf, uint32_t Len)
usbData.rxBufHead = ptr % USB_RX_BUFSIZE;
receiveLength = ((usbData.rxBufHead - usbData.rxBufTail)>0?(usbData.rxBufHead - usbData.rxBufTail):(usbData.rxBufHead + USB_RX_BUFSIZE - usbData.rxBufTail)) % USB_RX_BUFSIZE;
if((receiveLength) > (USB_RX_BUFSIZE-1))
receiveLength = ((usbData.rxBufHead - usbData.rxBufTail) > 0 ?
(usbData.rxBufHead - usbData.rxBufTail) :
(usbData.rxBufHead + USB_RX_BUFSIZE - usbData.rxBufTail)) % USB_RX_BUFSIZE;
if(receiveLength > (USB_RX_BUFSIZE-1))
return USBD_FAIL;
return USBD_OK;
}