|
22 | 22 | #include <assert.h>
|
23 | 23 | #include <syscfg/syscfg.h>
|
24 | 24 | #include <os/os.h>
|
| 25 | +#include <bsp/bsp.h> |
25 | 26 | #include <nimble/ble.h>
|
26 | 27 | #include <nimble/nimble_opt.h>
|
27 | 28 | #include <nimble/nimble_npl.h>
|
|
38 | 39 | * DPPI somewhere else.
|
39 | 40 | * TODO maybe we could reduce number of used channels if we reuse same channel
|
40 | 41 | * for mutually exclusive events but for now make it simpler to debug.
|
| 42 | + * |
| 43 | + * Optionally channels 6,7,8 are used for GPIO DBG. |
41 | 44 | */
|
42 | 45 |
|
43 | 46 | #define DPPI_CH_TIMER0_EVENTS_COMPARE_0 0
|
|
82 | 85 | #define DPPI_SUBSCRIBE_CCM_TASKS_CRYPT(_enable) ((DPPI_CH_RADIO_EVENTS_ADDRESS << CCM_SUBSCRIBE_CRYPT_CHIDX_Pos) | \
|
83 | 86 | ((_enable) << CCM_SUBSCRIBE_CRYPT_EN_Pos))
|
84 | 87 |
|
| 88 | +/* used for GPIO DBG */ |
| 89 | +#define DPPI_CH_RADIO_EVENTS_READY 6 |
| 90 | +#define DPPI_CH_RADIO_EVENTS_RXREADY 7 |
| 91 | +#define DPPI_CH_RADIO_EVENTS_DISABLED 8 |
| 92 | + |
| 93 | +#define DPPI_CH_ENABLE_RADIO_EVENTS_READY DPPIC_CHEN_CH6_Msk |
| 94 | +#define DPPI_CH_ENABLE_RADIO_EVENTS_RXREADY DPPIC_CHEN_CH7_Msk |
| 95 | +#define DPPI_CH_ENABLE_RADIO_EVENTS_DISABLED DPPIC_CHEN_CH8_Msk |
| 96 | + |
| 97 | +#define DPPI_PUBLISH_RADIO_EVENTS_READY ((DPPI_CH_RADIO_EVENTS_READY << RADIO_PUBLISH_READY_CHIDX_Pos) | \ |
| 98 | + (RADIO_PUBLISH_READY_EN_Enabled << RADIO_PUBLISH_READY_EN_Pos)) |
| 99 | +#define DPPI_PUBLISH_RADIO_EVENTS_RXREADY ((DPPI_CH_RADIO_EVENTS_RXREADY << RADIO_PUBLISH_RXREADY_CHIDX_Pos) | \ |
| 100 | + (RADIO_PUBLISH_RXREADY_EN_Enabled << RADIO_PUBLISH_RXREADY_EN_Pos)) |
| 101 | +#define DPPI_PUBLISH_RADIO_EVENTS_DISABLED ((DPPI_CH_RADIO_EVENTS_DISABLED << RADIO_PUBLISH_DISABLED_CHIDX_Pos) | \ |
| 102 | + (RADIO_PUBLISH_DISABLED_EN_Enabled << RADIO_PUBLISH_DISABLED_EN_Pos)) |
| 103 | + |
| 104 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_SET_TXRXEN ((DPPI_CH_TIMER0_EVENTS_COMPARE_0 << GPIOTE_SUBSCRIBE_SET_CHIDX_Pos) | \ |
| 105 | + (1 << GPIOTE_SUBSCRIBE_SET_EN_Pos)) |
| 106 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_SET_ADDRESS ((DPPI_CH_RADIO_EVENTS_ADDRESS << GPIOTE_SUBSCRIBE_SET_CHIDX_Pos) | \ |
| 107 | + (1 << GPIOTE_SUBSCRIBE_SET_EN_Pos)) |
| 108 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_END ((DPPI_CH_RADIO_EVENTS_END << GPIOTE_SUBSCRIBE_CLR_CHIDX_Pos) | \ |
| 109 | + (1 << GPIOTE_SUBSCRIBE_CLR_EN_Pos)) |
| 110 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_READY ((DPPI_CH_RADIO_EVENTS_READY << GPIOTE_SUBSCRIBE_CLR_CHIDX_Pos) | \ |
| 111 | + (1 << GPIOTE_SUBSCRIBE_CLR_EN_Pos)) |
| 112 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_SET_RXREADY ((DPPI_CH_RADIO_EVENTS_RXREADY << GPIOTE_SUBSCRIBE_SET_CHIDX_Pos) | \ |
| 113 | + (1 << GPIOTE_SUBSCRIBE_SET_EN_Pos)) |
| 114 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_DISABLED ((DPPI_CH_RADIO_EVENTS_DISABLED << GPIOTE_SUBSCRIBE_CLR_CHIDX_Pos) | \ |
| 115 | + (1 << GPIOTE_SUBSCRIBE_CLR_EN_Pos)) |
| 116 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_CAPTURE3 ((DPPI_CH_TIMER0_EVENTS_COMPARE_3 << GPIOTE_SUBSCRIBE_CLR_CHIDX_Pos) | \ |
| 117 | + (1 << GPIOTE_SUBSCRIBE_CLR_EN_Pos)) |
| 118 | +#define DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_ADDRESS ((DPPI_CH_RADIO_EVENTS_ADDRESS << GPIOTE_SUBSCRIBE_CLR_CHIDX_Pos) | \ |
| 119 | + (1 << GPIOTE_SUBSCRIBE_CLR_EN_Pos)) |
| 120 | + |
85 | 121 | extern uint8_t g_nrf_num_irks;
|
86 | 122 | extern uint32_t g_nrf_irk_list[];
|
87 | 123 |
|
@@ -1179,6 +1215,84 @@ ble_phy_isr(void)
|
1179 | 1215 | os_trace_isr_exit();
|
1180 | 1216 | }
|
1181 | 1217 |
|
| 1218 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN) >= 0 || \ |
| 1219 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN) >= 0 || \ |
| 1220 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN) >= 0 |
| 1221 | +static inline void |
| 1222 | +ble_phy_dbg_time_setup_gpiote(int index, int pin) |
| 1223 | +{ |
| 1224 | + NRF_GPIO_Type *port; |
| 1225 | + |
| 1226 | + port = pin > 31 ? NRF_P1_NS : NRF_P0_NS; |
| 1227 | + pin &= 0x1f; |
| 1228 | + |
| 1229 | + /* Configure GPIO directly to avoid dependency to hal_gpio (for porting) */ |
| 1230 | + port->DIRSET = (1 << pin); |
| 1231 | + port->OUTCLR = (1 << pin); |
| 1232 | + |
| 1233 | + NRF_GPIOTE_NS->CONFIG[index] = |
| 1234 | + (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | |
| 1235 | + ((pin & 0x1F) << GPIOTE_CONFIG_PSEL_Pos) | |
| 1236 | + ((port == NRF_P1_NS) << GPIOTE_CONFIG_PORT_Pos); |
| 1237 | +} |
| 1238 | +#endif |
| 1239 | + |
| 1240 | +static void |
| 1241 | +ble_phy_dbg_time_setup(void) |
| 1242 | +{ |
| 1243 | + int gpiote_idx __attribute__((unused)) = 8; |
| 1244 | + |
| 1245 | + /* |
| 1246 | + * We setup GPIOTE starting from last configuration index to minimize risk |
| 1247 | + * of conflict with GPIO setup via hal. It's not great solution, but since |
| 1248 | + * this is just debugging code we can live with this. |
| 1249 | + */ |
| 1250 | + |
| 1251 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN) >= 0 |
| 1252 | + ble_phy_dbg_time_setup_gpiote(--gpiote_idx, |
| 1253 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN)); |
| 1254 | + |
| 1255 | + NRF_GPIOTE_NS->SUBSCRIBE_SET[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_SET_TXRXEN; |
| 1256 | + NRF_GPIOTE_NS->SUBSCRIBE_CLR[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_READY; |
| 1257 | + |
| 1258 | + /* Publish RADIO->EVENTS_READY */ |
| 1259 | + NRF_RADIO_NS->PUBLISH_READY = DPPI_PUBLISH_RADIO_EVENTS_READY; |
| 1260 | + NRF_DPPIC_NS->CHENSET = DPPI_CH_ENABLE_RADIO_EVENTS_READY; |
| 1261 | + |
| 1262 | +#endif |
| 1263 | + |
| 1264 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN) >= 0 |
| 1265 | + ble_phy_dbg_time_setup_gpiote(--gpiote_idx, |
| 1266 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN)); |
| 1267 | + |
| 1268 | + NRF_GPIOTE_NS->SUBSCRIBE_SET[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_SET_ADDRESS; |
| 1269 | + NRF_GPIOTE_NS->SUBSCRIBE_CLR[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_END; |
| 1270 | +#endif |
| 1271 | + |
| 1272 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN) >= 0 |
| 1273 | + ble_phy_dbg_time_setup_gpiote(--gpiote_idx, |
| 1274 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN)); |
| 1275 | + |
| 1276 | + NRF_GPIOTE_NS->SUBSCRIBE_SET[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_SET_RXREADY; |
| 1277 | + |
| 1278 | + /* TODO figure out how (if?) to subscribe task to multiple DPPI channels |
| 1279 | + * Currently only last one is working. Also using multiple GPIOTE for same |
| 1280 | + * PIN doesn't work... |
| 1281 | + */ |
| 1282 | + NRF_GPIOTE_NS->SUBSCRIBE_CLR[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_DISABLED; |
| 1283 | + NRF_GPIOTE_NS->SUBSCRIBE_CLR[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_ADDRESS; |
| 1284 | + NRF_GPIOTE_NS->SUBSCRIBE_CLR[gpiote_idx] = DPPI_SUBSCRIBE_GPIOTE_TASKS_CLR_CAPTURE3; |
| 1285 | + |
| 1286 | + /* Publish RADIO->EVENTS_RXREADY */ |
| 1287 | + NRF_RADIO_NS->PUBLISH_RXREADY = DPPI_PUBLISH_RADIO_EVENTS_RXREADY; |
| 1288 | + NRF_DPPIC_NS->CHENSET = DPPI_CH_ENABLE_RADIO_EVENTS_RXREADY; |
| 1289 | + |
| 1290 | + /* Publish RADIO->EVENTS_DISABLED */ |
| 1291 | + NRF_RADIO_NS->PUBLISH_DISABLED = DPPI_CH_ENABLE_RADIO_EVENTS_DISABLED; |
| 1292 | + NRF_DPPIC_NS->CHENSET = DPPI_CH_ENABLE_RADIO_EVENTS_DISABLED; |
| 1293 | +#endif |
| 1294 | +} |
| 1295 | + |
1182 | 1296 | int
|
1183 | 1297 | ble_phy_init(void)
|
1184 | 1298 | {
|
@@ -1296,6 +1410,8 @@ ble_phy_init(void)
|
1296 | 1410 | g_ble_phy_data.phy_stats_initialized = 1;
|
1297 | 1411 | }
|
1298 | 1412 |
|
| 1413 | + ble_phy_dbg_time_setup(); |
| 1414 | + |
1299 | 1415 | return 0;
|
1300 | 1416 | }
|
1301 | 1417 |
|
@@ -1725,13 +1841,50 @@ ble_phy_restart_rx(void)
|
1725 | 1841 | ble_phy_rx();
|
1726 | 1842 | }
|
1727 | 1843 |
|
| 1844 | +static void |
| 1845 | +ble_phy_dbg_clear_pins(void) |
| 1846 | +{ |
| 1847 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN) >= 0 || \ |
| 1848 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN) >= 0 || \ |
| 1849 | + MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN) >= 0 |
| 1850 | + NRF_GPIO_Type *port; |
| 1851 | + int pin; |
| 1852 | + |
| 1853 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN) >= 0 |
| 1854 | + pin = MYNEWT_VAL(BLE_PHY_DBG_TIME_TXRXEN_READY_PIN); |
| 1855 | + port = pin > 31 ? NRF_P1_NS : NRF_P0_NS; |
| 1856 | + pin &= 0x1f; |
| 1857 | + |
| 1858 | + port->OUTCLR = (1 << pin); |
| 1859 | +#endif |
| 1860 | + |
| 1861 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN) >= 0 |
| 1862 | + pin = MYNEWT_VAL(BLE_PHY_DBG_TIME_ADDRESS_END_PIN); |
| 1863 | + port = pin > 31 ? NRF_P1_NS : NRF_P0_NS; |
| 1864 | + pin &= 0x1f; |
| 1865 | + |
| 1866 | + port->OUTCLR = (1 << pin); |
| 1867 | +#endif |
| 1868 | + |
| 1869 | +#if MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN) >= 0 |
| 1870 | + pin = MYNEWT_VAL(BLE_PHY_DBG_TIME_WFR_PIN); |
| 1871 | + port = pin > 31 ? NRF_P1_NS : NRF_P0_NS; |
| 1872 | + pin &= 0x1f; |
| 1873 | + |
| 1874 | + port->OUTCLR = (1 << pin); |
| 1875 | +#endif |
| 1876 | +#endif |
| 1877 | +} |
| 1878 | + |
1728 | 1879 | void
|
1729 | 1880 | ble_phy_disable(void)
|
1730 | 1881 | {
|
1731 | 1882 | ble_phy_trace_void(BLE_PHY_TRACE_ID_DISABLE);
|
1732 | 1883 |
|
1733 | 1884 | ble_phy_stop_usec_timer();
|
1734 | 1885 | ble_phy_disable_irq_and_ppi();
|
| 1886 | + |
| 1887 | + ble_phy_dbg_clear_pins(); |
1735 | 1888 | }
|
1736 | 1889 |
|
1737 | 1890 | uint32_t
|
|
0 commit comments