1 /* Firmware file for lx-rocon tumbl coprocessor */
4 #include "tumbl_addr.h"
6 typedef struct pxmcc_axis_data_t {
7 uint32_t ptirc; /* IRC count per phase table */
8 uint32_t ptper; /* number of periods per table */
9 uint32_t ptreci; /* number of periods per table */
10 uint32_t ptofs; /* offset between table and IRC counter */
17 pxmcc_axis_data_t pxmcc_axis[1];
19 void init_defvals(void)
23 void find_sin_lat(void)
26 register uint32_t a0, a1, a2, a3, a4, a5;
28 *FPGA_FNCAPPROX_SIN = 0;
30 for (i = 0; i < 20; i++)
31 asm volatile("": : : "memory");
33 *FPGA_FNCAPPROX_SIN = 0x40000000;
34 a0 = *FPGA_FNCAPPROX_SIN;
35 a1 = *FPGA_FNCAPPROX_SIN;
36 a2 = *FPGA_FNCAPPROX_SIN;
37 a3 = *FPGA_FNCAPPROX_SIN;
38 a4 = *FPGA_FNCAPPROX_SIN;
39 a5 = *FPGA_FNCAPPROX_SIN;
40 asm volatile("": : : "memory");
53 pxmcc_axis_data_t *pxmcc = pxmcc_axis;
55 pxmcc->ptirc = *FPGA_IRC0;
56 pxmcc->ptofs = pxmcc->ptirc;
58 pxmcc->ptreci = 2147484; /* (1LL<<32)/ptper */
60 asm volatile("": : : "memory");
65 uint32_t irc = *FPGA_IRC0;
66 uint32_t ofs = pxmcc->ptofs;
67 uint32_t per = pxmcc->ptper;
73 if ((uint32_t)pti >= per) {
84 pta = pti * pxmcc->ptreci;
86 *FPGA_FNCAPPROX_SIN = pta;
88 dummy = *FPGA_FNCAPPROX_SIN;
89 dummy = *FPGA_FNCAPPROX_SIN;
90 dummy = *FPGA_FNCAPPROX_SIN;
91 pxmcc->ptsin = *FPGA_FNCAPPROX_SIN;
92 dummy = *FPGA_FNCAPPROX_COS;
93 pxmcc->ptcos = *FPGA_FNCAPPROX_COS;
95 asm volatile("": : : "memory");