diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/drivers/llcc68/llcc68_raw.c b/drivers/llcc68/llcc68_raw.c index cbf2e69..6398dd1 100644 --- a/drivers/llcc68/llcc68_raw.c +++ b/drivers/llcc68/llcc68_raw.c @@ -2,13 +2,14 @@ #include #include +#include #include #define DT_DRV_COMPAT semtech_llcc68_weihua -#define LLCC68_AUTO_RF_SWITCH_MODE(inst) \ - COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, tx_enable_gpios), \ - (COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, rx_enable_gpios), \ +#define LLCC68_AUTO_RF_SWITCH_MODE(inst) \ + COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, tx_enable_gpios), \ + (COND_CODE_1(DT_INST_NODE_HAS_PROP(inst, rx_enable_gpios), \ (LLCC68_RF_SWITCH_GPIO_COMPLEMENTARY), (LLCC68_RF_SWITCH_NONE))), \ (LLCC68_RF_SWITCH_NONE)) @@ -22,9 +23,12 @@ #define LLCC68_DEFAULT_RF_SWITCH_MODE(inst) LLCC68_AUTO_RF_SWITCH_MODE(inst) #endif -#define LLCC68_RF_SWITCH_MODE(inst) \ +#define LLCC68_RF_SWITCH_MODE(inst) \ DT_ENUM_IDX_OR(DT_DRV_INST(inst), rf_switch_mode, LLCC68_DEFAULT_RF_SWITCH_MODE(inst)) +#define LLCC68_SPI_CS_DELAY_US(inst) \ + DIV_ROUND_UP(DT_INST_PROP(inst, spi_cs_setup_delay_ns), NSEC_PER_USEC) + static void dio1_irq_trampoline(const struct device *port, struct gpio_callback *cb, uint32_t pins) { ARG_UNUSED(port); @@ -69,34 +73,35 @@ int llcc68_init(const struct device *dev) { return 0; } -#define LLCC68_DEFINE(inst) \ - BUILD_ASSERT(LLCC68_RF_SWITCH_MODE(inst) != LLCC68_RF_SWITCH_GPIO_COMPLEMENTARY || \ - (DT_INST_NODE_HAS_PROP(inst, tx_enable_gpios) && \ - DT_INST_NODE_HAS_PROP(inst, rx_enable_gpios)), \ - "LLCC68 gpio-complementary RF switch mode requires tx-enable-gpios " \ - "and rx-enable-gpios"); \ - BUILD_ASSERT(LLCC68_RF_SWITCH_MODE(inst) != LLCC68_RF_SWITCH_DIO2_SINGLE || \ - !DT_INST_NODE_HAS_PROP(inst, tx_enable_gpios), \ - "LLCC68 dio2-single RF switch mode uses DIO2 for TXEN and must not " \ - "define tx-enable-gpios"); \ - static struct llcc68_data llcc68_data_##inst; \ - static const struct llcc68_config llcc68_config_##inst = \ - { \ - .spi = SPI_DT_SPEC_INST_GET(inst, SPI_WORD_SET(8) | SPI_TRANSFER_MSB), \ - .reset_gpio = GPIO_DT_SPEC_INST_GET(inst, reset_gpios), \ - .busy_gpio = GPIO_DT_SPEC_INST_GET(inst, busy_gpios), \ - .dio1_gpio = GPIO_DT_SPEC_INST_GET(inst, dio1_gpios), \ - .tx_enable_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, tx_enable_gpios, {.port = NULL}), \ - .rx_enable_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, rx_enable_gpios, {.port = NULL}), \ - .rf_switch_mode = LLCC68_RF_SWITCH_MODE(inst), \ - }; \ - DEVICE_DT_INST_DEFINE(inst, \ - llcc68_init, \ - NULL, \ - &llcc68_data_##inst, \ - &llcc68_config_##inst, \ - POST_KERNEL, \ - CONFIG_LLCC68_INIT_PRIORITY, \ +#define LLCC68_DEFINE(inst) \ + BUILD_ASSERT(LLCC68_RF_SWITCH_MODE(inst) != LLCC68_RF_SWITCH_GPIO_COMPLEMENTARY || \ + (DT_INST_NODE_HAS_PROP(inst, tx_enable_gpios) && \ + DT_INST_NODE_HAS_PROP(inst, rx_enable_gpios)), \ + "LLCC68 gpio-complementary RF switch mode requires tx-enable-gpios " \ + "and rx-enable-gpios"); \ + BUILD_ASSERT(LLCC68_RF_SWITCH_MODE(inst) != LLCC68_RF_SWITCH_DIO2_SINGLE || \ + !DT_INST_NODE_HAS_PROP(inst, tx_enable_gpios), \ + "LLCC68 dio2-single RF switch mode uses DIO2 for TXEN and must not " \ + "define tx-enable-gpios"); \ + static struct llcc68_data llcc68_data_##inst; \ + static const struct llcc68_config llcc68_config_##inst = \ + { \ + .spi = SPI_DT_SPEC_INST_GET( \ + inst, SPI_WORD_SET(8) | SPI_TRANSFER_MSB, LLCC68_SPI_CS_DELAY_US(inst)), \ + .reset_gpio = GPIO_DT_SPEC_INST_GET(inst, reset_gpios), \ + .busy_gpio = GPIO_DT_SPEC_INST_GET(inst, busy_gpios), \ + .dio1_gpio = GPIO_DT_SPEC_INST_GET(inst, dio1_gpios), \ + .tx_enable_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, tx_enable_gpios, {.port = NULL}), \ + .rx_enable_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, rx_enable_gpios, {.port = NULL}), \ + .rf_switch_mode = LLCC68_RF_SWITCH_MODE(inst), \ + }; \ + DEVICE_DT_INST_DEFINE(inst, \ + llcc68_init, \ + NULL, \ + &llcc68_data_##inst, \ + &llcc68_config_##inst, \ + POST_KERNEL, \ + CONFIG_LLCC68_INIT_PRIORITY, \ NULL) BUILD_ASSERT(DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT), diff --git a/dts/bindings/semtech,llcc68-weihua.yaml b/dts/bindings/semtech,llcc68-weihua.yaml index 8b86a40..b660f5a 100644 --- a/dts/bindings/semtech,llcc68-weihua.yaml +++ b/dts/bindings/semtech,llcc68-weihua.yaml @@ -71,7 +71,9 @@ properties: which the driver holds active. This mode must not use tx-enable-gpios. spi-cs-setup-delay-ns: + type: int default: 100000 spi-cs-hold-delay-ns: + type: int default: 100000