45 #define PRINTF(...) printf(__VA_ARGS__)
48 #ifndef MACA_BOUND_CHECK
49 #define MACA_BOUND_CHECK 0
51 #if (MACA_BOUND_CHECK == 0)
52 #define BOUND_CHECK(x)
54 #define BOUND_CHECK(x) bound_check(x)
58 #define NUM_PACKETS 32
62 #define MACA_CLOCK_DIV 95
65 #define CLK_PER_BYTE 8
67 #ifndef RECV_SOFTIMEOUT
68 #define RECV_SOFTIMEOUT (1024*128*CLK_PER_BYTE)
72 #define CPL_TIMEOUT (2*128*CLK_PER_BYTE)
75 #ifndef MACA_INSERT_ACK
76 #define MACA_INSERT_ACK 1
81 #define MAC_ACK_REQUEST_FLAG 0x20
83 #define reg(x) (*(volatile uint32_t *)(x))
85 int count_packets(
void);
86 void Print_Packets(
char *s);
88 static volatile packet_t packet_pool[NUM_PACKETS];
89 static volatile packet_t *free_head, *rx_end, *tx_end, *dma_tx, *dma_rx;
94 volatile packet_t *rx_head, *tx_head;
98 static volatile packet_t dummy_ack;
99 static volatile packet_t dummy_rx;
103 volatile uint32_t maca_entry = 0;
111 static volatile uint8_t last_post = NO_POST;
115 volatile uint8_t maca_pwr = 0;
117 volatile uint8_t fcs_mode = USE_FCS;
118 volatile uint8_t prm_mode = PROMISC;
127 void check_maca(
void) {
128 safe_irq_disable(MACA);
129 static volatile uint32_t last_time;
130 static volatile uint32_t last_entry;
133 volatile uint32_t count;
140 for(i=0; (i < 1024) && (*MACA_CLK == last_time); i++) {
continue; }
142 if(*MACA_CLK == last_time) {
143 PRINTF(
"check maca: maca_clk stopped, restarting\n");
146 *INTFRC = (1<<INT_NUM_MACA);
148 if((last_time > (*MACA_SFTCLK + RECV_SOFTIMEOUT)) &&
149 (last_time > (*MACA_CPLCLK + CPL_TIMEOUT))) {
150 PRINTF(
"check maca: complete clocks expired\n");
154 if(last_entry == maca_entry) {
155 PRINTF(
"check maca: forcing isr\n");
156 *INTFRC = (1<<INT_NUM_MACA);
161 last_entry = maca_entry;
162 last_time = *MACA_CLK;
165 if((count = count_packets()) != NUM_PACKETS) {
166 PRINTF(
"check maca: count_packets %d\n", (
int)count);
167 Print_Packets(
"check_maca");
169 for(i=0; i<NUM_PACKETS; i++) {
170 printf(
"packet 0x%lx seen %d post_tx %d get_free %d rxd %d\n",
171 (uint32_t) &packet_pool[i],
173 packet_pool[i].post_tx,
174 packet_pool[i].get_free,
178 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
184 void maca_init(
void) {
192 free_head = 0; tx_head = 0; rx_head = 0; rx_end = 0; tx_end = 0; dma_tx = 0; dma_rx = 0;
196 Print_Packets(
"maca_init");
203 (NO_CCA << MACA_MODE);
206 *INTFRC = (1 << INT_NUM_MACA);
209 #define print_packets(x) Print_Packets(x)
210 void Print_Packets(
char *s) {
211 volatile packet_t *p;
213 printf(
"packet pool after %s:\n\r",s);
215 printf(
"free_head: 0x%lx ", (uint32_t) free_head);
218 printf(
"->0x%lx", (uint32_t) p);
223 printf(
"tx_head: 0x%lx ", (uint32_t) tx_head);
226 printf(
"->0x%lx", (uint32_t) p);
231 printf(
"rx_head: 0x%lx ", (uint32_t) rx_head);
234 printf(
"->0x%lx", (uint32_t) p);
238 printf(
"dma_rx: 0x%lx\n", (uint32_t) dma_rx);
239 printf(
"dma_tx: 0x%lx\n", (uint32_t) dma_tx);
243 inline void bad_packet_bounds(
void) {
244 PRINTF(
"bad packet bounds! Halting.\n");
245 while(1) {
continue; }
248 int count_packets(
void) {
249 volatile int8_t total = -1;
252 volatile packet_t *pk;
253 volatile uint8_t tx, rx, free;
256 for(i = 0; i < NUM_PACKETS; i++) {
257 packet_pool[i].seen = 0;
260 pk = tx_head; tx = 0;
262 if(pk->seen == 0) { tx++; }
266 pk = rx_head; rx = 0;
268 if(pk->seen == 0) { rx++; }
272 pk = free_head; free = 0;
274 if(pk->seen == 0) { free++; }
279 total = free + rx + tx;
280 if(dma_rx && (dma_rx->seen == 0)) { dma_rx->seen++; total++; }
281 if(dma_tx && (dma_tx->seen == 0)) { dma_tx->seen++; total++; }
287 void bound_check(
volatile packet_t *p) {
291 (p == &dummy_ack)) {
return; }
292 for(i=0; i < NUM_PACKETS; i++) {
293 if(p == &packet_pool[i]) {
return; }
303 void maca_free_packet(
volatile packet_t *p) {
304 safe_irq_disable(MACA);
308 if(!p) { PRINTF(
"free_packet passed packet 0\n\r");
return; }
309 if(p == &dummy_ack) {
return; }
311 BOUND_CHECK(free_head);
313 p->length = 0; p->offset = 0;
314 p->left = free_head; p->right = 0;
324 BOUND_CHECK(free_head);
327 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
332 volatile packet_t* get_free_packet(
void) {
333 volatile packet_t *p;
335 safe_irq_disable(MACA);
337 BOUND_CHECK(free_head);
342 free_head->right = 0;
345 BOUND_CHECK(free_head);
353 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
358 void post_receive(
void) {
363 *MACA_TXLEN = (MAX_PACKET_SIZE << 16);
365 dma_rx = get_free_packet();
367 PRINTF(
"trying to fill MACA_DMARX in post_receieve but out of packet buffers\n\r");
370 *MACA_SFTCLK = *MACA_CLK + RECV_SOFTIMEOUT;
371 *MACA_TMREN = (1 << maca_tmren_sft);
379 *MACA_DMARX = (uint32_t)&(dma_rx->data[0]);
381 *MACA_SFTCLK = *MACA_CLK + RECV_SOFTIMEOUT;
382 *MACA_TMREN = (1 << maca_tmren_sft);
384 *MACA_CONTROL = ( (1 << maca_ctrl_asap) |
386 ( fcs_mode << NOFC ) |
388 #if 0 //dak says removing ctrl auto fixes the autoack checksum error --- doesn't cause a performance issue either
389 (1 << maca_ctrl_auto) |
398 volatile packet_t* rx_packet(
void) {
399 volatile packet_t *p;
400 safe_irq_disable(MACA);
402 BOUND_CHECK(rx_head);
416 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
430 *MACA_TXSEQNR = dma_tx->data[2];
431 *MACA_TXLEN = (uint32_t)((dma_tx->length) + 2) | (3 << 16);
432 *MACA_DMATX = (uint32_t)&(dma_tx->data[ 0 + dma_tx->offset]);
434 dma_rx = get_free_packet();
437 PRINTF(
"trying to fill MACA_DMARX on post_tx but out of packet buffers\n\r");
443 *MACA_DMARX = (uint32_t)&(dma_rx->data[0]);
446 *MACA_TMRDIS = (1 << maca_tmren_sft) | ( 1<< maca_tmren_cpl) | ( 1 << maca_tmren_strt ) ;
450 *MACA_CPLCLK = *MACA_CLK + CPL_TIMEOUT;
452 *MACA_TMREN = (1 << maca_tmren_cpl);
455 *MACA_CONTROL = ( ( 4 << PRECOUNT) |
457 (maca_ctrl_mode_no_cca << maca_ctrl_mode) |
458 (1 << maca_ctrl_asap) |
465 void tx_packet(
volatile packet_t *p) {
466 safe_irq_disable(MACA);
470 if(!p) { PRINTF(
"tx_packet passed packet 0\n\r");
return; }
474 tx_end->left = 0; tx_end->right = 0;
481 tx_end = p; tx_end->left = 0;
485 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
486 if(last_post == NO_POST) { *INTFRC = (1<<INT_NUM_MACA); }
488 if(last_post == RX_POST) { *MACA_SFTCLK = *MACA_CLK + CLK_PER_BYTE; }
492 void free_all_packets(
void) {
494 safe_irq_disable(MACA);
497 for(i=0; i<NUM_PACKETS; i++) {
498 maca_free_packet((
volatile packet_t *)&(packet_pool[i]));
500 rx_head = 0; rx_end = 0;
501 tx_head = 0; tx_end = 0;
504 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
511 void free_tx_head(
void) {
512 volatile packet_t *p;
513 safe_irq_disable(MACA);
515 BOUND_CHECK(tx_head);
518 tx_head = tx_head->left;
519 if(tx_head == 0) { tx_end = 0; }
524 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
529 void add_to_rx(
volatile packet_t *p) {
530 safe_irq_disable(MACA);
534 if(!p) { PRINTF(
"add_to_rx passed packet 0\n\r");
return; }
539 rx_end->left = 0; rx_end->right = 0;
544 rx_end = p; rx_end->left = 0;
549 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
554 void insert_at_rx_head(
volatile packet_t *p) {
555 safe_irq_disable(MACA);
559 if(!p) { PRINTF(
"insert_at_rx_head passed packet 0\n\r");
return; }
564 rx_end->left = 0; rx_end->right = 0;
575 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
581 void decode_status(
void) {
582 volatile uint32_t code;
584 code = get_field(*MACA_STATUS,CODE);
591 PRINTF(
"maca: aborted\n\r");
598 PRINTF(
"maca: not completed\n\r");
605 PRINTF(
"maca: timeout\n\r");
612 PRINTF(
"maca: no ack\n\r");
619 PRINTF(
"maca: ext timeout\n\r");
624 case EXT_PND_TIMEOUT:
626 PRINTF(
"maca: ext pnd timeout\n\r");
638 PRINTF(
"status: %x", (
unsigned int)*MACA_STATUS);
645 void maca_isr(
void) {
651 if (bit_is_set(*MACA_STATUS, maca_status_ovr))
652 { PRINTF(
"maca overrun\n\r"); }
653 if (bit_is_set(*MACA_STATUS, maca_status_busy))
654 { PRINTF(
"maca busy\n\r"); }
655 if (bit_is_set(*MACA_STATUS, maca_status_crc))
656 { PRINTF(
"maca crc error\n\r"); }
657 if (bit_is_set(*MACA_STATUS, maca_status_to))
658 { PRINTF(
"maca timeout\n\r"); }
660 if (data_indication_irq()) {
661 *MACA_CLRIRQ = (1 << maca_irq_di);
663 if (dma_rx != &dummy_ack && dma_rx != &dummy_rx)
665 dma_rx->length = *MACA_GETRXLVL - 2;
666 dma_rx->lqi = get_lqi();
667 dma_rx->rx_time = *MACA_TIMESTAMP;
670 if(prm_mode == AUTOACK && (dma_rx->data[1] & 0x20)) {
672 volatile uint32_t wait_clk;
673 wait_clk = *MACA_CLK + 200;
674 while(*MACA_CLK < wait_clk) {
continue; }
677 if(maca_rx_callback != 0) { maca_rx_callback(dma_rx); }
683 if (filter_failed_irq()) {
684 PRINTF(
"maca filter failed\n\r");
686 *MACA_CLRIRQ = (1 << maca_irq_flt);
688 if (checksum_failed_irq()) {
689 PRINTF(
"maca checksum failed\n\r");
691 *MACA_CLRIRQ = (1 << maca_irq_crc);
693 if (softclock_irq()) {
694 *MACA_CLRIRQ = (1 << maca_irq_sftclk);
697 *MACA_CLRIRQ = (1 << maca_irq_poll);
699 if(action_complete_irq()) {
701 if(last_post == TX_POST) {
702 tx_head->status = get_field(*MACA_STATUS,CODE);
711 if(tx_head->status == SUCCESS && (tx_head->data[0] & MAC_ACK_REQUEST_FLAG)) {
715 static volatile packet_t *ack_p;
716 if(ack_p = get_free_packet()) {
720 ack_p->data[1] = 0x02;
722 ack_p->data[3] = *MACA_TXSEQNR;
723 insert_at_rx_head(ack_p);
729 if(maca_tx_callback != 0) { maca_tx_callback(tx_head); }
735 *MACA_CLRIRQ = (1 << maca_irq_acpl);
741 { PRINTF(
"*MACA_IRQ %x\n\r", (
unsigned int)*MACA_IRQ); }
751 static uint8_t ram_values[4];
757 *MACA_CLKDIV = MACA_CLOCK_DIV;
758 *MACA_WARMUP = 0x00180012;
759 *MACA_EOFDELAY = 0x00000004;
760 *MACA_CCADELAY = 0x001a0022;
761 *MACA_TXCCADELAY = 0x00000025;
762 *MACA_FRAMESYNC0 = 0x000000A7;
763 *MACA_CLK = 0x00000008;
764 *MACA_RXACKDELAY = 30;
766 *MACA_TXACKDELAY = 68;
767 *MACA_MASKIRQ = ((1 << maca_irq_rst) |
768 (1 << maca_irq_acpl) |
770 (1 << maca_irq_flt) |
771 (1 << maca_irq_crc) |
773 (1 << maca_irq_sftclk)
775 *MACA_SLOTOFFSET = 0x00350000;
778 void reset_maca(
void)
780 volatile uint32_t cnt;
782 *MACA_RESET = (1 << maca_reset_rst);
784 for(cnt = 0; cnt < 100; cnt++) {};
786 *MACA_RESET = (1 << maca_reset_clkon);
788 *MACA_CONTROL = maca_ctrl_seq_nop;
790 for(cnt = 0; cnt < 400000; cnt++) {};
793 *MACA_CLRIRQ = 0xffff;
819 #define RF_BASE 0x80009a00
820 void flyback_init(
void) {
823 val8 = *(
volatile uint32_t *)(RF_BASE+8);
824 or = val8 | 0x0000f7df;
825 *(
volatile uint32_t *)(RF_BASE+8) = or;
826 *(
volatile uint32_t *)(RF_BASE+12) = 0x00ffffff;
827 *(
volatile uint32_t *)(RF_BASE+16) = (((uint32_t)0x00ffffff)>>12);
828 *(
volatile uint32_t *)(RF_BASE) = 16;
833 const uint32_t addr_seq1[MAX_SEQ1] = {
838 const uint32_t data_seq1[MAX_SEQ1] = {
845 const uint32_t addr_seq2[MAX_SEQ2] = {
850 const uint32_t data_seq2[MAX_SEQ2] = {
855 #define MAX_CAL3_SEQ1 3
856 const uint32_t addr_cal3_seq1[MAX_CAL3_SEQ1] = { 0x80009400,0x80009a04,0x80009a00, };
857 const uint32_t data_cal3_seq1[MAX_CAL3_SEQ1] = {0x00020017,0x8185a0a4,0x8c900025, };
859 #define MAX_CAL3_SEQ2 2
860 const uint32_t addr_cal3_seq2[MAX_CAL3_SEQ2] = { 0x80009a00,0x80009a00,};
861 const uint32_t data_cal3_seq2[MAX_CAL3_SEQ2] = { 0x8c900021,0x8c900027,};
863 #define MAX_CAL3_SEQ3 1
864 const uint32_t addr_cal3_seq3[MAX_CAL3_SEQ3] = { 0x80009a00 };
865 const uint32_t data_cal3_seq3[MAX_CAL3_SEQ3] = { 0x8c900000 };
868 const uint32_t addr_cal5[MAX_CAL5] = {
874 const uint32_t data_cal5[MAX_CAL5] = {
882 const uint32_t addr_reg_rep[MAX_DATA] = { 0x80004118,0x80009204,0x80009208,0x8000920c,0x80009210,0x80009300,0x80009304,0x80009308,0x8000930c,0x80009310,0x80009314,0x80009318,0x80009380,0x80009384,0x80009388,0x8000938c,0x80009390,0x80009394,0x8000a008,0x8000a018,0x8000a01c,0x80009424,0x80009434,0x80009438,0x8000943c,0x80009440,0x80009444,0x80009448,0x8000944c,0x80009450,0x80009460,0x80009464,0x8000947c,0x800094e0,0x800094e4,0x800094e8,0x800094ec,0x800094f0,0x800094f4,0x800094f8,0x80009470,0x8000981c,0x80009828 };
884 const uint32_t data_reg_rep[MAX_DATA] = { 0x00180012,0x00000605,0x00000504,0x00001111,0x0fc40000,0x20046000,0x4005580c,0x40075801,0x4005d801,0x5a45d800,0x4a45d800,0x40044000,0x00106000,0x00083806,0x00093807,0x0009b804,0x000db800,0x00093802,0x00000015,0x00000002,0x0000000f,0x0000aaa0,0x01002020,0x016800fe,0x8e578248,0x000000dd,0x00000946,0x0000035a,0x00100010,0x00000515,0x00397feb,0x00180358,0x00000455,0x00000001,0x00020003,0x00040014,0x00240034,0x00440144,0x02440344,0x04440544,0x0ee7fc00,0x00000082,0x0000002a };
886 void maca_off(
void) {
888 if (maca_pwr == 0)
return;
891 while (last_post == TX_POST) {
900 *MACA_TMRDIS = (1 << maca_tmren_sft) | ( 1<< maca_tmren_cpl) | ( 1 << maca_tmren_strt);
903 CRM->VREG_CNTLbits.VREG_1P8V_EN = 0;
904 CRM->VREG_CNTLbits.VREG_1P5V_EN = 0;
907 maca_reset = maca_reset_rst;
918 CRM->VREG_CNTLbits.VREG_1P8V_EN = 1;
919 CRM->VREG_CNTLbits.VREG_1P5V_EN = 3;
920 while(CRM->STATUSbits.VREG_1P8V_RDY == 0) {
continue; }
921 while(CRM->STATUSbits.VREG_1P5V_RDY == 0) {
continue; }
924 *MACA_RESET = (1 << maca_reset_clkon);
927 while (!((*(
volatile uint32_t *)0x80003018) & (1<< 19))) {}
934 *MACA_CONTROL = maca_ctrl_seq_nop | (1 << maca_ctrl_asap);
938 *MACA_MASKIRQ = ((1 << maca_irq_rst) |
939 (1 << maca_irq_acpl) |
941 (1 << maca_irq_flt) |
942 (1 << maca_irq_crc) |
944 (1 << maca_irq_sftclk)
948 *MACA_CLRIRQ = 0xffff;
951 *INTFRC = (1 << INT_NUM_MACA);
976 #define _INIT_CTOV_WORD_1 0x00dfbe77
977 #define _INIT_CTOV_WORD_2 0x023126e9
978 uint8_t get_ctov( uint32_t r0, uint32_t r1 )
981 r0 = r0 * _INIT_CTOV_WORD_1;
983 r0 += _INIT_CTOV_WORD_2;
985 r0 = (uint32_t)(((int32_t)r0) >> 25);
995 for(i=0; i<MAX_SEQ1; i++) {
996 if((
unsigned int)addr_seq1[i] != (
unsigned int)CRM_VREG_CNTL) {
997 *(
volatile uint32_t *)(addr_seq1[i]) = data_seq1[i];
1001 for(i=0; i<0x161a8; i++) {
continue; }
1003 for(i=0; i<MAX_SEQ2; i++) {
1004 *(
volatile uint32_t *)(addr_seq2[i]) = data_seq2[i];
1007 *(
volatile uint32_t *)0x80009000 = 0x80050100;
1009 for(i=0; i<MAX_CAL3_SEQ1; i++) {
1010 *(
volatile uint32_t *)(addr_cal3_seq1[i]) = data_cal3_seq1[i];
1013 for(i=0; i<0x11194; i++) {
continue; }
1015 for(i=0; i<MAX_CAL3_SEQ2; i++) {
1016 *(
volatile uint32_t *)(addr_cal3_seq2[i]) = data_cal3_seq2[i];
1019 for(i=0; i<0x11194; i++) {
continue; }
1021 for(i=0; i<MAX_CAL3_SEQ3; i++) {
1022 *(
volatile uint32_t *)(addr_cal3_seq3[i]) = data_cal3_seq3[i];
1025 for(i=0; i<MAX_CAL5; i++) {
1026 if((
unsigned int)addr_cal5[i] != (
unsigned int)CRM_VREG_CNTL) {
1027 *(
volatile uint32_t *)(addr_cal5[i]) = data_cal5[i];
1031 for(i=0; i<MAX_DATA; i++) {
1032 *(
volatile uint32_t *)(addr_reg_rep[i]) = data_reg_rep[i];
1035 PRINTF(
"initfromflash\n\r");
1037 init_from_flash(0x1F000);
1039 PRINTF(
"ram_values:\n\r");
1040 for(i=0; i<4; i++) {
1041 PRINTF(
" 0x%02x\n\r",ram_values[i]);
1044 PRINTF(
"radio_init: ctov parameter 0x%02x\n\r",ram_values[3]);
1045 for(i=0; i<16; i++) {
1046 ctov[i] = get_ctov(i,ram_values[3]);
1047 PRINTF(
"radio_init: ctov[%d] = 0x%02x\n\r",(
int)i,ctov[i]);
1053 const uint32_t PSMVAL[19] = {
1075 const uint32_t PAVAL[19] = {
1097 const uint32_t AIMVAL[19] = {
1119 #define RF_REG 0x80009400
1120 void set_demodulator_type(uint8_t demod) {
1121 uint32_t val = reg(RF_REG);
1122 if(demod == DEMOD_NCD) {
1131 #define ADDR_POW1 0x8000a014
1132 #define ADDR_POW2 ADDR_POW1 + 12
1133 #define ADDR_POW3 ADDR_POW1 + 64
1134 void set_power(uint8_t power) {
1135 safe_irq_disable(MACA);
1137 reg(ADDR_POW1) = PSMVAL[power];
1142 reg(ADDR_POW2) = 0xffffdfff & PAVAL[power];
1144 reg(ADDR_POW2) = 0x00002000 | PAVAL[power];
1147 reg(ADDR_POW3) = AIMVAL[power];
1150 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
1154 const uint8_t VCODivI[16] = {
1173 const uint32_t VCODivF[16] = {
1193 #define ADDR_CHAN1 0x80009800
1194 #define ADDR_CHAN2 (ADDR_CHAN1+12)
1195 #define ADDR_CHAN3 (ADDR_CHAN1+16)
1196 #define ADDR_CHAN4 (ADDR_CHAN1+48)
1197 void set_channel(uint8_t chan) {
1198 volatile uint32_t tmp;
1199 safe_irq_disable(MACA);
1201 tmp = reg(ADDR_CHAN1);
1202 tmp = tmp & 0xbfffffff;
1203 reg(ADDR_CHAN1) = tmp;
1205 reg(ADDR_CHAN2) = VCODivI[chan];
1206 reg(ADDR_CHAN3) = VCODivF[chan];
1208 tmp = reg(ADDR_CHAN4);
1210 reg(ADDR_CHAN4) = tmp;
1212 tmp = reg(ADDR_CHAN4);
1214 reg(ADDR_CHAN4) = tmp;
1216 tmp = tmp & 0xffffe0ff;
1217 tmp = tmp | (((ctov[chan])<<8)&0x1F00);
1218 reg(ADDR_CHAN4) = tmp;
1221 if(bit_is_set(*NIPEND, INT_NUM_MACA)) { *INTFRC = (1 << INT_NUM_MACA); }
1224 uint8_t (*get_lqi)(void) = (
void *) 0x0000e04d;
1226 #define ROM_END 0x0013ffff
1227 #define ENTRY_EOF 0x00000e0f
1230 uint32_t exec_init_entry(
volatile uint32_t *entries, uint8_t *valbuf)
1232 volatile uint32_t i;
1233 if(entries[0] <= ROM_END) {
1234 if (entries[0] == 0) {
1236 PRINTF(
"init_entry: delay 0x%08x\n\r", (
unsigned int)entries[1]);
1237 for(i=0; i<entries[1]; i++) {
continue; }
1239 }
else if (entries[0] == 1) {
1241 PRINTF(
"init_entry: bit set clear 0x%08x 0x%08x 0x%08x\n\r", (
unsigned int)entries[1], (
unsigned int)entries[2], (
unsigned int)entries[3]);
1242 reg(entries[2]) = (reg(entries[2]) & ~entries[1]) | (entries[3] & entries[1]);
1244 }
else if ((entries[0] >= 16) &&
1245 (entries[0] < 0xfff1)) {
1247 PRINTF(
"init_entry: store in valbuf 0x%02x position %d\n\r",
1248 (
unsigned int)entries[1],
1249 (
unsigned int)(entries[0]>>4)-1);
1250 valbuf[(entries[0]>>4)-1] = entries[1];
1252 }
else if (entries[0] == ENTRY_EOF) {
1253 PRINTF(
"init_entry: eof ");
1257 PRINTF(
"init_entry: invaild code 0x%08x\n\r",(
unsigned int)entries[0]);
1262 PRINTF(
"init_entry: address value pair - *0x%08x = 0x%08x\n\r",
1263 (
unsigned int)entries[0],
1264 (
unsigned int)entries[1]);
1265 if ((
unsigned int)entries[0] != (
unsigned int)CRM_VREG_CNTL) {
1266 reg(entries[0]) = entries[1];
1268 PRINTF(
"skipping VREG_CNTL\n\r");
1275 #define FLASH_INIT_MAGIC 0x00000abc
1276 uint32_t init_from_flash(uint32_t addr) {
1279 volatile uint32_t buf[8];
1280 volatile uint32_t len;
1281 volatile uint32_t i=0,j;
1283 err = nvm_detect(gNvmInternalInterface_c, &type);
1284 PRINTF(
"nvm_detect returned type 0x%08x err 0x%02x\n\r", type, err);
1287 err = nvm_read(gNvmInternalInterface_c, type, (uint8_t *)buf, addr, 8);
1289 PRINTF(
"nvm_read returned: 0x%02x\n\r",err);
1291 for(j=0; j<4; j++) {
1292 PRINTF(
"0x%08x\n\r",(
unsigned int)buf[j]);
1295 if(buf[0] == FLASH_INIT_MAGIC) {
1296 len = buf[1] & 0x0000ffff;
1297 while(i < (len-4)) {
1298 err = nvm_read(gNvmInternalInterface_c, type, (uint8_t *)buf, addr+i, 32);
1299 i += 4*exec_init_entry(buf, ram_values);
1312 void ResumeMACASync(
void)
1314 volatile uint32_t clk, TsmRxSteps, LastWarmupStep, LastWarmupData, LastWarmdownStep, LastWarmdownData;
1316 volatile uint32_t i;
1317 safe_irq_disable(MACA);
1325 TsmRxSteps = (*((
volatile uint32_t *)(0x80009204)));
1329 LastWarmupStep = (TsmRxSteps & 0x1f) << 2;
1331 LastWarmupData = (*((
volatile uint32_t *)(0x80009300 + LastWarmupStep)));
1336 LastWarmdownStep = ((TsmRxSteps & 0x1f00) >> 8) << 2;
1338 LastWarmdownData = (*((
volatile uint32_t *)(0x80009300 + LastWarmdownStep)));
1339 (*((
volatile uint32_t *)(0x80009300 + LastWarmupStep))) = LastWarmdownData;
1342 MACA_WRITE(maca_control, 1);
1345 for (clk = maca_clk, i = 0; maca_clk - clk < 3 && i < 300; i++)
1349 MACA_WRITE(maca_control, 0);
1352 for (clk = maca_clk, i = 0; maca_clk - clk < 3 && i < 300; i++)
1357 (*((
volatile uint32_t *)(0x80009300 + LastWarmupStep))) = LastWarmupData;
1362 MACA_WRITE(maca_clrirq, 0xFFFF);
radio_status_t radio_init(bool cal_rc_osc, hal_rx_start_isr_event_handler_t rx_event, hal_trx_end_isr_event_handler_t trx_end_event, radio_rx_callback rx_callback)
Initialize the Transceiver Access Toolbox and lower layers.