Revision 33f54213 source/DW1000/v1/alld_dw1000_v1.c
source/DW1000/v1/alld_dw1000_v1.c | ||
---|---|---|
28 | 28 |
* |
29 | 29 |
*/ |
30 | 30 |
|
31 |
|
|
32 | 31 |
#include <alld_DW1000.h> |
33 | 32 |
|
34 | 33 |
#if (defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1)) || defined(__DOXYGEN__) |
35 | 34 |
|
35 |
#include <v1/alld_dw1000_regs_v1.h> |
|
36 |
|
|
36 | 37 |
#include <aos_thread.h> |
37 | 38 |
#include <assert.h> |
38 | 39 |
#include <string.h> |
... | ... | |
40 | 41 |
#include <math.h> |
41 | 42 |
|
42 | 43 |
|
44 |
// HW dependent implementation (see bottom of file) |
|
45 |
static int writetospi(uint16_t headerLength, |
|
46 |
const uint8_t *headerBuffer, |
|
47 |
uint32_t bodyLength, |
|
48 |
const uint8_t *bodyBuffer); |
|
49 |
|
|
50 |
static int readfromspi(uint16_t headerLength, |
|
51 |
const uint8_t *headerBuffer, |
|
52 |
uint32_t readlength, |
|
53 |
uint8_t *readBuffer); |
|
54 |
|
|
55 |
|
|
43 | 56 |
// Defines for enable_clocks function |
44 | 57 |
#define FORCE_SYS_XTI 0 |
45 | 58 |
#define ENABLE_ALL_SEQ 1 |
... | ... | |
57 | 70 |
#define FCTRL_LEN_MAX 2 |
58 | 71 |
|
59 | 72 |
|
60 |
/** |
|
61 |
* Move to the header file <alld_dw1000_v1.h> |
|
62 |
*/ |
|
63 |
//#define NUM_BR 3 |
|
64 |
//#define NUM_PRF 2 |
|
65 |
//#define NUM_PACS 4 |
|
66 |
//#define NUM_BW 2 //2 bandwidths are supported |
|
67 |
//#define NUM_SFD 2 //supported number of SFDs - standard = 0, non-standard = 1 |
|
68 |
//#define NUM_CH 6 //supported channels are 1, 2, 3, 4, 5, 7 |
|
69 |
//#define NUM_CH_SUPPORTED 8 //supported channels are '0', 1, 2, 3, 4, 5, '6', 7 |
|
70 |
//#define PCODES 25 //supported preamble codes |
|
71 |
|
|
72 |
|
|
73 | 73 |
typedef struct { |
74 | 74 |
uint32_t lo32; |
75 | 75 |
uint16_t target[NUM_PRF]; |
... | ... | |
1013 | 1013 |
#define VTEMP_ADDRESS (0x09) |
1014 | 1014 |
#define XTRIM_ADDRESS (0x1E) |
1015 | 1015 |
|
1016 |
//int dwt_initialise(const uint16_t config, DW1000Driver* drv)
|
|
1017 |
int dwt_initialise(const uint16_t config) // TODO: |
|
1016 |
int dwt_initialise(const uint16_t config, DW1000Driver* drv) |
|
1017 |
//int dwt_initialise(const uint16_t config) // TODO:
|
|
1018 | 1018 |
{ |
1019 | 1019 |
uint16_t otp_addr = 0; |
1020 | 1020 |
uint32_t ldo_tune = 0; |
... | ... | |
1028 | 1028 |
pdw1000local->cbRxTo = NULL; |
1029 | 1029 |
pdw1000local->cbRxErr = NULL; |
1030 | 1030 |
|
1031 |
// pdw1000local->driver = drv; // TODO:
|
|
1031 |
pdw1000local->driver = drv; // TODO: |
|
1032 | 1032 |
|
1033 | 1033 |
// Read and validate device ID return -1 if not recognised |
1034 | 1034 |
if (DWT_DEVICE_ID != dwt_readdevid()) // MP IC ONLY (i.e. DW1000) FOR THIS CODE |
... | ... | |
1813 | 1813 |
} |
1814 | 1814 |
|
1815 | 1815 |
// Write it to the SPI |
1816 |
// _alld_dw1000_writespi(cnt,header,length,buffer); |
|
1817 |
writetospi(cnt,header,length,buffer); // TODO |
|
1816 |
writetospi(cnt,header,length,buffer); |
|
1818 | 1817 |
} // end dwt_writetodevice() |
1819 | 1818 |
|
1820 | 1819 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
1878 | 1877 |
} |
1879 | 1878 |
|
1880 | 1879 |
// Do the read from the SPI |
1881 |
// _alld_dw1000_readspi(cnt, header, length, buffer); // result is stored in the buffer |
|
1882 |
readfromspi(cnt, header, length, buffer); // TODO: |
|
1880 |
readfromspi(cnt, header, length, buffer); |
|
1883 | 1881 |
} // end dwt_readfromdevice() |
1884 | 1882 |
|
1885 | 1883 |
|
... | ... | |
4419 | 4417 |
* |
4420 | 4418 |
****************************************************************************************************************************************************/ |
4421 | 4419 |
|
4422 |
/* |
|
4423 |
* DW1000 Hardware dependent functions: SPI, EXTI |
|
4424 |
*/ |
|
4420 |
/****************************************************************************//** |
|
4421 |
* |
|
4422 |
* alld_dw1000.c SPI Section |
|
4423 |
* |
|
4424 |
*******************************************************************************/ |
|
4425 | 4425 |
|
4426 | 4426 |
/*! ------------------------------------------------------------------------------------------------------------------ |
4427 | 4427 |
* Function: writetospi() |
... | ... | |
4431 | 4431 |
* returns 0 for success, or -1 for error |
4432 | 4432 |
*/ |
4433 | 4433 |
#pragma GCC optimize ("O3") |
4434 |
int writetospi(uint16_t headerLength, |
|
4434 |
static int writetospi(uint16_t headerLength,
|
|
4435 | 4435 |
const uint8_t *headerBuffer, |
4436 | 4436 |
uint32_t bodyLength, |
4437 | 4437 |
const uint8_t *bodyBuffer) |
4438 | 4438 |
{ |
4439 | 4439 |
|
4440 |
port_SPIx_clear_chip_select(); |
|
4441 |
|
|
4442 | 4440 |
uint8_t buffer[bodyLength + 3]; |
4443 | 4441 |
memcpy(buffer, headerBuffer, headerLength); //copy data to buffer |
4444 | 4442 |
memcpy(&buffer[headerLength], bodyBuffer, bodyLength); //copy data to buffer |
... | ... | |
4447 | 4445 |
buffer, |
4448 | 4446 |
bodyLength + headerLength); // send header and data |
4449 | 4447 |
|
4450 |
port_SPIx_set_chip_select(); |
|
4451 |
|
|
4452 | 4448 |
return 0; |
4453 | 4449 |
} // end writetospi() |
4454 | 4450 |
|
4455 | 4451 |
|
4456 |
|
|
4457 | 4452 |
/*! ------------------------------------------------------------------------------------------------------------------ |
4458 | 4453 |
* Function: readfromspi() |
4459 | 4454 |
* |
... | ... | |
4463 | 4458 |
* or returns -1 if there was an error |
4464 | 4459 |
*/ |
4465 | 4460 |
#pragma GCC optimize ("O3") |
4466 |
int readfromspi(uint16_t headerLength, |
|
4461 |
static int readfromspi(uint16_t headerLength,
|
|
4467 | 4462 |
const uint8_t *headerBuffer, |
4468 | 4463 |
uint32_t readlength, |
4469 | 4464 |
uint8_t *readBuffer) |
4470 | 4465 |
{ |
4471 | 4466 |
|
4472 |
apalSPITransmitAndReceive(&MODULE_HAL_SPI_UWB, |
|
4467 |
apalSPITransmitAndReceive(&MODULE_HAL_SPI_UWB, // TODO: "pdw1000local->driver->spid" fails two spi configs
|
|
4473 | 4468 |
headerBuffer, |
4474 | 4469 |
readBuffer, |
4475 | 4470 |
headerLength, |
... | ... | |
4499 | 4494 |
* |
4500 | 4495 |
* returns the state of the DW1000 interrupt |
4501 | 4496 |
*/ |
4502 |
decaIrqStatus_t decamutexon(void)
|
|
4497 |
decaIrqStatus_t decamutexon(void) |
|
4503 | 4498 |
{ |
4504 |
decaIrqStatus_t s = port_GetEXT_IRQStatus(); |
|
4505 | 4499 |
|
4506 |
if(s) { |
|
4507 |
port_DisableEXT_IRQ(); //disable the external interrupt line |
|
4508 |
} |
|
4509 |
return s ; // return state before disable, value is used to re-enable in decamutexoff call |
|
4500 |
decaIrqStatus_t s = port_GetEXT_IRQStatus(); |
|
4501 |
if(s) { |
|
4502 |
port_DisableEXT_IRQ(); //disable the external interrupt line |
|
4503 |
} |
|
4504 |
return s ; // return state before disable, value is used to re-enable in decamutexoff call |
|
4510 | 4505 |
} |
4511 | 4506 |
|
4512 | 4507 |
/*! ------------------------------------------------------------------------------------------------------------------ |
... | ... | |
4526 | 4521 |
*/ |
4527 | 4522 |
void decamutexoff(decaIrqStatus_t s) |
4528 | 4523 |
{ |
4529 |
// (void) s;
|
|
4530 |
if(s) { //need to check the port state as we can't use level sensitive interrupt on the STM ARM
|
|
4531 |
port_EnableEXT_IRQ();
|
|
4532 |
}
|
|
4533 |
// return;
|
|
4524 |
// (void) s; |
|
4525 |
if(s) { //need to check the port state as we can't use level sensitive interrupt on the STM ARM |
|
4526 |
port_EnableEXT_IRQ(); |
|
4527 |
} |
|
4528 |
return; |
|
4534 | 4529 |
} |
4535 | 4530 |
|
4536 | 4531 |
|
... | ... | |
4540 | 4535 |
|
4541 | 4536 |
void deca_sleep(unsigned int time_ms) |
4542 | 4537 |
{ |
4543 |
aosThdMSleep(time_ms);
|
|
4538 |
aosThdMSleep(time_ms); |
|
4544 | 4539 |
} |
4545 | 4540 |
|
4546 | 4541 |
void Sleep(unsigned int time_ms) |
4547 | 4542 |
{ |
4548 |
aosThdMSleep(time_ms);
|
|
4543 |
aosThdMSleep(time_ms); |
|
4549 | 4544 |
} |
4550 | 4545 |
|
4551 | 4546 |
|
4552 |
void port_set_dw1000_slowrate(){ // replaced with setHighSpeed_SPI(bool speedValue) implemented in module.c |
|
4553 |
return; |
|
4554 |
} |
|
4555 |
|
|
4556 |
void port_set_dw1000_fastrate(){ // replaced with setHighSpeed_SPI(bool speedValue) implemented in module.c |
|
4557 |
return; |
|
4558 |
} |
|
4559 |
|
|
4560 | 4547 |
void port_wakeup_dw1000_fast(){ // NOT SUPPORTED |
4561 |
return;
|
|
4548 |
return; |
|
4562 | 4549 |
} |
4563 | 4550 |
|
4564 | 4551 |
uint32_t portGetTickCnt(){ |
4565 |
return chVTGetSystemTimeX();
|
|
4552 |
return chVTGetSystemTimeX(); |
|
4566 | 4553 |
} |
4567 | 4554 |
|
4568 | 4555 |
//inline uint32_t portGetTickCnt(){ |
... | ... | |
4571 | 4558 |
|
4572 | 4559 |
|
4573 | 4560 |
void port_DisableEXT_IRQ(void){ |
4574 |
nvicDisableVector(DW1000_EXTI_IRQn);
|
|
4561 |
nvicDisableVector(DW1000_EXTI_IRQn); |
|
4575 | 4562 |
|
4576 | 4563 |
} |
4577 | 4564 |
|
4578 | 4565 |
void port_EnableEXT_IRQ(void){ |
4579 |
nvicEnableVector(DW1000_EXTI_IRQn, STM32_IRQ_EXTI10_15_PRIORITY);
|
|
4566 |
nvicEnableVector(DW1000_EXTI_IRQn, STM32_IRQ_EXTI10_15_PRIORITY); |
|
4580 | 4567 |
} |
4581 | 4568 |
|
4582 | 4569 |
|
4583 |
ITStatus port_GetEXT_IRQStatus(void){ |
|
4584 |
ITStatus bitstatus = RESET; |
|
4585 |
// uint32_t enablestatus = 0; |
|
4570 |
decaIrqStatus_t port_GetEXT_IRQStatus(void){ |
|
4571 |
decaIrqStatus_t bitstatus = RESET; |
|
4586 | 4572 |
|
4587 | 4573 |
if(NVIC_GetActive(DW1000_EXTI_IRQn)|| NVIC_GetPendingIRQ(DW1000_EXTI_IRQn)){ |
4588 | 4574 |
// if(NVIC_GetPendingIRQ(EXTI15_10_IRQn)){ //if the interrupt is pending (background ) |
4589 | 4575 |
bitstatus = SET; //Interrupt is active or panding |
4590 | 4576 |
} |
4591 | 4577 |
else { |
4592 |
bitstatus = RESET; //Currently there is no interrupt IRQ
|
|
4578 |
bitstatus = RESET; //No interrupt IRQ at the moment
|
|
4593 | 4579 |
} |
4594 | 4580 |
|
4595 | 4581 |
return bitstatus; |
4596 | 4582 |
} |
4597 | 4583 |
|
4598 |
|
|
4599 |
|
|
4600 | 4584 |
#endif /* defined(AMIROLLD_CFG_DW1000) && (AMIROLLD_CFG_DW1000 == 1) */ |
Also available in: Unified diff