mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-02 14:13:42 -04:00
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
|