mirror of https://github.com/ArduPilot/ardupilot
101 lines
2.0 KiB
C++
101 lines
2.0 KiB
C++
/*
|
||
(c) 2017 night_ghost@ykoctpa.ru
|
||
|
||
|
||
* USBDriver.cpp --- AP_HAL_F4Light USB-UART driver.
|
||
*
|
||
*/
|
||
|
||
#include <AP_HAL/AP_HAL.h>
|
||
|
||
#if CONFIG_HAL_BOARD == HAL_BOARD_F4LIGHT
|
||
#include "USBDriver.h"
|
||
|
||
#include <stdio.h>
|
||
#include <unistd.h>
|
||
#include <stdlib.h>
|
||
#include <errno.h>
|
||
#include <fcntl.h>
|
||
#include <usb.h>
|
||
#include <gpio_hal.h>
|
||
#include "Scheduler.h"
|
||
|
||
using namespace F4Light;
|
||
|
||
extern const AP_HAL::HAL& hal;
|
||
|
||
|
||
// usb *can* be used in air, eg. to connect companion computer
|
||
|
||
|
||
|
||
USBDriver::USBDriver(bool usb):
|
||
_initialized(false),
|
||
_blocking(false)
|
||
{
|
||
}
|
||
|
||
void USBDriver::begin(uint32_t baud) {
|
||
|
||
/* _usb_present = gpio_read_bit(PIN_MAP[BOARD_USB_SENSE].gpio_device,PIN_MAP[BOARD_USB_SENSE].gpio_bit);
|
||
using of this bit prevents USB hotplug
|
||
*/
|
||
|
||
_initialized = true; // real USB initialization was much earlier
|
||
}
|
||
|
||
|
||
uint32_t USBDriver::available() {
|
||
uint32_t v = usb_data_available();
|
||
return v;
|
||
}
|
||
|
||
uint32_t USBDriver::txspace() { return usb_tx_space(); }
|
||
|
||
|
||
int16_t USBDriver::read() {
|
||
if(is_usb_opened() ){
|
||
if (available() == 0)
|
||
return -1;
|
||
return usb_getc();
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
size_t USBDriver::write(uint8_t c) {
|
||
return write(&c,1);
|
||
}
|
||
|
||
|
||
size_t USBDriver::write(const uint8_t *buffer, size_t size)
|
||
{
|
||
size_t n = 0;
|
||
uint32_t t = Scheduler::_micros();
|
||
|
||
if(is_usb_opened()){
|
||
while(true) {
|
||
uint8_t k=usb_write((uint8_t *)buffer, size);
|
||
size-=k;
|
||
n+=k;
|
||
buffer+=k;
|
||
if(size == 0) break; //done
|
||
|
||
uint32_t now = Scheduler::_micros();
|
||
if(k==0) {
|
||
if(!_blocking && now - t > 5000 ){ // время ожидания превысило 5мс - что-то пошло не так...
|
||
reset_usb_opened();
|
||
return n;
|
||
}
|
||
if(!is_usb_opened()) break;
|
||
hal_yield(0);
|
||
} else {
|
||
t = now;
|
||
}
|
||
}
|
||
return n;
|
||
}
|
||
return size;
|
||
}
|
||
|
||
#endif // CONFIG_HAL_BOARD
|