openpcd/openpicc/application/tc_cdiv_sync.c @ master
1 | 1dfa375a | henryk | /* Synchronize TC_CDIV divided sample clock with the SOF of the packet */
|
---|---|---|---|
2 | |||
3 | #include <lib_AT91SAM7.h>
|
||
4 | #include <AT91SAM7.h>
|
||
5 | a72e0c20 | henryk | #include "tc_cdiv_sync.h"
|
6 | 1dfa375a | henryk | #include "dbgu.h"
|
7 | #include "pio_irq.h"
|
||
8 | #include "openpicc.h"
|
||
9 | 3d0a9bd4 | henryk | #include "led.h"
|
10 | 5ec39e97 | henryk | #include "tc_cdiv.h"
|
11 | 1dfa375a | henryk | |
12 | #define USE_IRQ
|
||
13 | |||
14 | static u_int8_t enabled; |
||
15 | |||
16 | static void pio_data_change(u_int32_t pio) |
||
17 | {
|
||
18 | (void)pio; |
||
19 | DEBUGP("PIO_FRAME_IRQ: "); |
||
20 | /* we get one interrupt for each change. If now, after the
|
||
21 | * change the level is high, then it must have been a rising
|
||
22 | * edge */
|
||
23 | if (*AT91C_PIOA_PDSR & OPENPICC_PIO_FRAME) { |
||
24 | 616746c2 | henryk | vLedSetGreen(1); |
25 | aa804cf4 | henryk | /* This code is now replaced by hard-coded assembler code in os/boot/boot.s my_fiq_handler */
|
26 | /* *AT91C_TC0_CCR = AT91C_TC_SWTRG;*/
|
||
27 | 1dfa375a | henryk | DEBUGPCR("CDIV_SYNC_FLIP SWTRG CV=0x%08x", |
28 | *AT91C_TC0_CV); |
||
29 | 616746c2 | henryk | vLedSetGreen(0); |
30 | 1dfa375a | henryk | } else |
31 | DEBUGPCR(""); |
||
32 | 5cc0ed49 | henryk | //vLedSetGreen(0);
|
33 | 1dfa375a | henryk | }
|
34 | |||
35 | void tc_cdiv_sync_reset(void) |
||
36 | {
|
||
37 | if (enabled) { |
||
38 | u_int32_t tmp = *AT91C_PIOA_ISR; |
||
39 | (void)tmp; |
||
40 | volatile int i; |
||
41 | DEBUGPCRF("CDIV_SYNC_FLOP"); |
||
42 | 5cc0ed49 | henryk | //vLedSetGreen(1);
|
43 | 1dfa375a | henryk | |
44 | 5ec39e97 | henryk | /* reset the hardware flipflop, this clears FRAME */
|
45 | 1dfa375a | henryk | AT91F_PIO_ClearOutput(AT91C_BASE_PIOA, |
46 | OPENPICC_PIO_SSC_DATA_CONTROL); |
||
47 | for (i = 0; i < 0xff; i++) ; |
||
48 | AT91F_PIO_SetOutput(AT91C_BASE_PIOA, |
||
49 | OPENPICC_PIO_SSC_DATA_CONTROL); |
||
50 | a72e0c20 | henryk | |
51 | if(OPENPICC->features.clock_gating) { |
||
52 | /* reset tc_cdiv counter, the cleared frame signal stopped the tc_cdiv clock */
|
||
53 | tc_cdiv_reset(); |
||
54 | }
|
||
55 | 1dfa375a | henryk | }
|
56 | }
|
||
57 | |||
58 | void tc_cdiv_sync_disable(void) |
||
59 | {
|
||
60 | enabled = 0; |
||
61 | *AT91C_PIOA_IDR = OPENPICC_PIO_FRAME; |
||
62 | }
|
||
63 | |||
64 | void tc_cdiv_sync_enable(void) |
||
65 | {
|
||
66 | enabled = 1; |
||
67 | |||
68 | DEBUGPCRF("CDIV_SYNC_ENABLE "); |
||
69 | tc_cdiv_sync_reset(); |
||
70 | *AT91C_PIOA_IER = OPENPICC_PIO_FRAME; |
||
71 | }
|
||
72 | |||
73 | a72e0c20 | henryk | void tc_cdiv_sync_init() |
74 | 1dfa375a | henryk | {
|
75 | 5cc0ed49 | henryk | pio_irq_init_once(); |
76 | 1dfa375a | henryk | DEBUGPCRF("initializing"); |
77 | |||
78 | enabled = 0; |
||
79 | |||
80 | AT91F_PIOA_CfgPMC(); |
||
81 | 3d0a9bd4 | henryk | AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OPENPICC_PIO_SSC_DATA_CONTROL); |
82 | |||
83 | aa804cf4 | henryk | /* This code is now replaced by hard-coded assembler code in os/boot/boot.s my_fiq_handler */
|
84 | /*pio_irq_register(OPENPICC_PIO_FRAME, &pio_data_change);*/
|
||
85 | (void)pio_data_change; |
||
86 | 3d0a9bd4 | henryk | |
87 | 5cc0ed49 | henryk | //vLedSetGreen(0);
|
88 | 1dfa375a | henryk | tc_cdiv_sync_disable(); |
89 | }
|