mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-31 05:11:36 +08:00
Merge branch 'master' into #111-px4io-integrated-mixing
Fix a botched merge for #106 at the same time.
This commit is contained in:
@@ -11,6 +11,7 @@ Make.dep
|
|||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
*~
|
*~
|
||||||
|
*.dSYM
|
||||||
Images/*.bin
|
Images/*.bin
|
||||||
Images/*.px4
|
Images/*.px4
|
||||||
nuttx/Make.defs
|
nuttx/Make.defs
|
||||||
@@ -40,3 +41,4 @@ nsh_romfsimg.h
|
|||||||
cscope.out
|
cscope.out
|
||||||
.configX-e
|
.configX-e
|
||||||
nuttx-export.zip
|
nuttx-export.zip
|
||||||
|
dot.gdbinit
|
||||||
|
|||||||
@@ -61,28 +61,6 @@
|
|||||||
#define GPIO_LED3 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|\
|
#define GPIO_LED3 (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|\
|
||||||
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10)
|
GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN10)
|
||||||
|
|
||||||
/* R/C in/out channels **************************************************************/
|
|
||||||
|
|
||||||
/* XXX just GPIOs for now - eventually timer pins */
|
|
||||||
|
|
||||||
#define GPIO_CH1_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN0)
|
|
||||||
#define GPIO_CH2_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN1)
|
|
||||||
#define GPIO_CH3_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN8)
|
|
||||||
#define GPIO_CH4_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN9)
|
|
||||||
#define GPIO_CH5_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN6)
|
|
||||||
#define GPIO_CH6_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN7)
|
|
||||||
#define GPIO_CH7_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN0)
|
|
||||||
#define GPIO_CH8_IN (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN1)
|
|
||||||
|
|
||||||
#define GPIO_CH1_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN0)
|
|
||||||
#define GPIO_CH2_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN1)
|
|
||||||
#define GPIO_CH3_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN8)
|
|
||||||
#define GPIO_CH4_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN9)
|
|
||||||
#define GPIO_CH5_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN6)
|
|
||||||
#define GPIO_CH6_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN7)
|
|
||||||
#define GPIO_CH7_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN0)
|
|
||||||
#define GPIO_CH8_OUT (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTB|GPIO_PIN1)
|
|
||||||
|
|
||||||
/* Safety switch button *************************************************************/
|
/* Safety switch button *************************************************************/
|
||||||
|
|
||||||
#define GPIO_BTN_SAFETY (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN5)
|
#define GPIO_BTN_SAFETY (GPIO_INPUT|GPIO_CNF_INFLOAT|GPIO_MODE_INPUT|GPIO_PORTB|GPIO_PIN5)
|
||||||
|
|||||||
@@ -500,7 +500,7 @@ PX4FMU::pwm_ioctl(file *filp, int cmd, unsigned long arg)
|
|||||||
/* FALLTHROUGH */
|
/* FALLTHROUGH */
|
||||||
case PWM_SERVO_GET(0):
|
case PWM_SERVO_GET(0):
|
||||||
case PWM_SERVO_GET(1): {
|
case PWM_SERVO_GET(1): {
|
||||||
channel = cmd - PWM_SERVO_SET(0);
|
channel = cmd - PWM_SERVO_GET(0);
|
||||||
*(servo_position_t *)arg = up_pwm_servo_get(channel);
|
*(servo_position_t *)arg = up_pwm_servo_get(channel);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,6 +61,7 @@
|
|||||||
#include <drivers/device/device.h>
|
#include <drivers/device/device.h>
|
||||||
#include <drivers/drv_rc_input.h>
|
#include <drivers/drv_rc_input.h>
|
||||||
#include <drivers/drv_pwm_output.h>
|
#include <drivers/drv_pwm_output.h>
|
||||||
|
#include <drivers/drv_gpio.h>
|
||||||
#include <drivers/drv_hrt.h>
|
#include <drivers/drv_hrt.h>
|
||||||
#include <drivers/drv_mixer.h>
|
#include <drivers/drv_mixer.h>
|
||||||
|
|
||||||
@@ -117,6 +118,8 @@ private:
|
|||||||
|
|
||||||
bool _primary_pwm_device; ///< true if we are the default PWM output
|
bool _primary_pwm_device; ///< true if we are the default PWM output
|
||||||
|
|
||||||
|
uint32_t _relays; ///< state of the PX4IO relays, one bit per relay
|
||||||
|
|
||||||
volatile bool _switch_armed; ///< PX4IO switch armed state
|
volatile bool _switch_armed; ///< PX4IO switch armed state
|
||||||
// XXX how should this work?
|
// XXX how should this work?
|
||||||
|
|
||||||
@@ -195,6 +198,7 @@ PX4IO::PX4IO() :
|
|||||||
_mix_buf(nullptr),
|
_mix_buf(nullptr),
|
||||||
_mix_buf_len(0),
|
_mix_buf_len(0),
|
||||||
_primary_pwm_device(false),
|
_primary_pwm_device(false),
|
||||||
|
_relays(0),
|
||||||
_switch_armed(false),
|
_switch_armed(false),
|
||||||
_send_needed(false),
|
_send_needed(false),
|
||||||
_config_needed(false)
|
_config_needed(false)
|
||||||
@@ -542,7 +546,9 @@ PX4IO::io_send()
|
|||||||
/* XXX needs to be based off post-mix values from the IO side */
|
/* XXX needs to be based off post-mix values from the IO side */
|
||||||
orb_publish(ORB_ID_VEHICLE_CONTROLS, _t_outputs, &_outputs);
|
orb_publish(ORB_ID_VEHICLE_CONTROLS, _t_outputs, &_outputs);
|
||||||
|
|
||||||
// XXX relays
|
/* update relays */
|
||||||
|
for (unsigned i = 0; i < PX4IO_RELAY_CHANNELS; i++)
|
||||||
|
cmd.relay_state[i] = (_relays & (1<< i)) ? true : false;
|
||||||
|
|
||||||
/* armed and not locked down */
|
/* armed and not locked down */
|
||||||
cmd.arm_ok = (_armed.armed && !_armed.lockdown);
|
cmd.arm_ok = (_armed.armed && !_armed.lockdown);
|
||||||
@@ -641,6 +647,30 @@ PX4IO::ioctl(file *filep, int cmd, unsigned long arg)
|
|||||||
*(servo_position_t *)arg = _outputs.output[cmd - PWM_SERVO_GET(0)];
|
*(servo_position_t *)arg = _outputs.output[cmd - PWM_SERVO_GET(0)];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GPIO_RESET:
|
||||||
|
_relays = 0;
|
||||||
|
_send_needed = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPIO_SET:
|
||||||
|
case GPIO_CLEAR:
|
||||||
|
/* make sure only valid bits are being set */
|
||||||
|
if ((arg & ((1UL << PX4IO_RELAY_CHANNELS) - 1)) != arg) {
|
||||||
|
ret = EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (cmd == GPIO_SET) {
|
||||||
|
_relays |= arg;
|
||||||
|
} else {
|
||||||
|
_relays &= ~arg;
|
||||||
|
}
|
||||||
|
_send_needed = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPIO_GET:
|
||||||
|
*(uint32_t *)arg = _relays;
|
||||||
|
break;
|
||||||
|
|
||||||
case MIXERIOCGETOUTPUTCOUNT:
|
case MIXERIOCGETOUTPUTCOUNT:
|
||||||
*(unsigned *)arg = PX4IO_CONTROL_CHANNELS;
|
*(unsigned *)arg = PX4IO_CONTROL_CHANNELS;
|
||||||
break;
|
break;
|
||||||
|
|||||||
+19
-2
@@ -191,9 +191,26 @@ comms_handle_command(const void *buffer, size_t length)
|
|||||||
// if (!system_state.arm_ok && system_state.armed)
|
// if (!system_state.arm_ok && system_state.armed)
|
||||||
// system_state.armed = false;
|
// system_state.armed = false;
|
||||||
|
|
||||||
/* XXX do relay changes here */
|
/* handle relay state changes here */
|
||||||
for (unsigned i = 0; i < PX4IO_RELAY_CHANNELS; i++)
|
for (unsigned i = 0; i < PX4IO_RELAY_CHANNELS; i++) {
|
||||||
|
if (system_state.relays[i] != cmd->relay_state[i]) {
|
||||||
|
switch (i) {
|
||||||
|
case 0:
|
||||||
|
POWER_ACC1(cmd->relay_state[i]);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
POWER_ACC2(cmd->relay_state[i]);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
POWER_RELAY1(cmd->relay_state[i]);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
POWER_RELAY2(cmd->relay_state[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
system_state.relays[i] = cmd->relay_state[i];
|
system_state.relays[i] = cmd->relay_state[i];
|
||||||
|
}
|
||||||
|
|
||||||
irqrestore(flags);
|
irqrestore(flags);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -140,8 +140,8 @@ extern volatile int timers[TIMER_NUM_TIMERS];
|
|||||||
#define LED_SAFETY(_s) stm32_gpiowrite(GPIO_LED3, !(_s))
|
#define LED_SAFETY(_s) stm32_gpiowrite(GPIO_LED3, !(_s))
|
||||||
|
|
||||||
#define POWER_SERVO(_s) stm32_gpiowrite(GPIO_SERVO_PWR_EN, (_s))
|
#define POWER_SERVO(_s) stm32_gpiowrite(GPIO_SERVO_PWR_EN, (_s))
|
||||||
#define POWER_ACC1(_s) stm32_gpiowrite(GPIO_SERVO_ACC1_EN, (_s))
|
#define POWER_ACC1(_s) stm32_gpiowrite(GPIO_ACC1_PWR_EN, (_s))
|
||||||
#define POWER_ACC2(_s) stm32_gpiowrite(GPIO_SERVO_ACC2_EN, (_s))
|
#define POWER_ACC2(_s) stm32_gpiowrite(GPIO_ACC2_PWR_EN, (_s))
|
||||||
#define POWER_RELAY1(_s) stm32_gpiowrite(GPIO_RELAY1_EN, (_s))
|
#define POWER_RELAY1(_s) stm32_gpiowrite(GPIO_RELAY1_EN, (_s))
|
||||||
#define POWER_RELAY2(_s) stm32_gpiowrite(GPIO_RELAY2_EN, (_s))
|
#define POWER_RELAY2(_s) stm32_gpiowrite(GPIO_RELAY2_EN, (_s))
|
||||||
|
|
||||||
|
|||||||
@@ -660,9 +660,9 @@ static int uart_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
|
|
||||||
int ret = dev->ops->ioctl(filep, cmd, arg);
|
int ret = dev->ops->ioctl(filep, cmd, arg);
|
||||||
|
|
||||||
/* Append any higher level TTY flags */
|
/* If the low-level handler didn't handle the call, see if we can handle it here */
|
||||||
|
|
||||||
if (ret == OK)
|
if (ret == -ENOTTY)
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
@@ -686,8 +686,43 @@ static int uart_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
|||||||
irqrestore(state);
|
irqrestore(state);
|
||||||
|
|
||||||
*(int *)arg = count;
|
*(int *)arg = count;
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case FIONWRITE:
|
||||||
|
{
|
||||||
|
int count;
|
||||||
|
irqstate_t state = irqsave();
|
||||||
|
|
||||||
|
/* determine the number of bytes free in the buffer */
|
||||||
|
|
||||||
|
if (dev->xmit.head < dev->xmit.tail)
|
||||||
|
{
|
||||||
|
count = dev->xmit.tail - dev->xmit.head - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count = dev->xmit.size - (dev->xmit.head - dev->xmit.tail) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
irqrestore(state);
|
||||||
|
|
||||||
|
*(int *)arg = count;
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append any higher level TTY flags */
|
||||||
|
|
||||||
|
else if (ret == OK)
|
||||||
|
{
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
#ifdef CONFIG_SERIAL_TERMIOS
|
#ifdef CONFIG_SERIAL_TERMIOS
|
||||||
case TCGETS:
|
case TCGETS:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -110,6 +110,10 @@
|
|||||||
* OUT: Bytes readable from this fd
|
* OUT: Bytes readable from this fd
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define FIONWRITE _FIOC(0x0005) /* IN: Location to return value (int *)
|
||||||
|
* OUT: Bytes writable to this fd
|
||||||
|
*/
|
||||||
|
|
||||||
/* NuttX file system ioctl definitions **************************************/
|
/* NuttX file system ioctl definitions **************************************/
|
||||||
|
|
||||||
#define _DIOCVALID(c) (_IOC_TYPE(c)==_DIOCBASE)
|
#define _DIOCVALID(c) (_IOC_TYPE(c)==_DIOCBASE)
|
||||||
|
|||||||
Reference in New Issue
Block a user