]> rtime.felk.cvut.cz Git - mf624-simulink.git/blob - mf624_SIMULINK.h
Digital input for MF624 implemented.
[mf624-simulink.git] / mf624_SIMULINK.h
1 #ifndef MF624
2 #define MF624
3
4 #include <sys/types.h>
5 #include <stdint.h> // uintX_t
6 #include <inttypes.h>
7
8 #include "simstruc.h"
9
10 /* Hardware specific */
11 /* BAR0 */
12 #define GPIOC_reg               0x54
13
14 /* BAR2 */
15 #define ADCTRL_reg              0x00
16 #define ADDATA0_reg             0x00
17 #define ADDATA1_reg             0x02
18 #define ADDATA2_reg             0x04
19 #define ADDATA3_reg             0x06
20 #define ADDATA4_reg             0x08
21 #define ADDATA5_reg             0x0a
22 #define ADDATA6_reg             0x0c
23 #define ADDATA7_reg             0x0e
24 #define ADSTART_reg             0x20
25
26 #define DOUT_reg                0x10
27 #define DIN_reg                 0x10
28 #define DA0_reg                 0x20
29 #define DA1_reg                 0x22
30 #define DA2_reg                 0x24
31 #define DA3_reg                 0x26
32 #define DA4_reg                 0x28
33 #define DA5_reg                 0x2A
34 #define DA6_reg                 0x2C
35 #define DA7_reg                 0x2E
36
37 /* BAR4 */
38 #define CTR0MODE     0x00
39 #define CTR1MODE     0x10
40 #define CTR2MODE     0x20
41 #define CTR3MODE     0x30
42 #define CTR4MODE     0x40
43 #define CTR0         0x04
44 #define CTR1         0x14
45 #define CTR2         0x24
46 #define CTR3         0x34
47 #define CTR4         0x44
48 #define CTRXCTRL     0x60
49
50 #define IRCSTATUS_reg           0x6C
51 #define IRCCTRL_reg             0x6C
52 #define IRC0_reg                0x70
53 #define IRC1_reg                0x74
54 #define IRC2_reg                0x78
55 #define IRC3_reg                0x7C
56
57 #define IRCCTRL_IRC0MODE_mask   0x00000003
58 #define IRCCTRL_IRC0COUNT_mask  0x0000000C
59 #define IRCCTRL_IRC0RESET_mask  0x00000070
60 #define IRCCTRL_IRC0FILTER_mask 0x00000080
61
62 #define IRCCTRL_IRC1MODE_mask   0x00000300
63 #define IRCCTRL_IRC1COUNT_mask  0x00000C00
64 #define IRCCTRL_IRC1RESET_mask  0x00007000
65 #define IRCCTRL_IRC1FILTER_mask 0x00008000
66
67 #define IRCCTRL_IRC2MODE_mask   0x00030000
68 #define IRCCTRL_IRC2COUNT_mask  0x000C0000
69 #define IRCCTRL_IRC2RESET_mask  0x00700000
70 #define IRCCTRL_IRC2FILTER_mask 0x00800000
71
72 #define IRCCTRL_IRC3MODE_mask   0x03000000
73 #define IRCCTRL_IRC3COUNT_mask  0x0C000000
74 #define IRCCTRL_IRC3RESET_mask  0x70000000
75 #define IRCCTRL_IRC3FILTER_mask 0x80000000
76
77 #define IRCCTRL_CHANNEL_SHIFT   8
78
79 #define IRCCTRL_MODE_mask(ch)   (0x03<<((ch)*IRCCTRL_CHANNEL_SHIFT))
80 #define IRCCTRL_COUNT_mask(ch)  (0x0C<<((ch)*IRCCTRL_CHANNEL_SHIFT))
81 #define IRCCTRL_RESET_mask(ch)  (0x70<<((ch)*IRCCTRL_CHANNEL_SHIFT))
82 #define IRCCTRL_FILTER_mask(ch) (0x80<<((ch)*IRCCTRL_CHANNEL_SHIFT))
83
84 #define IRCCTRL_MODE_IRC        0
85 #define IRCCTRL_MODE_BIDIR_RE   1
86 #define IRCCTRL_MODE_BIDIR_FE   2
87 #define IRCCTRL_MODE_BIDIR_BOTH 3
88
89 #define IRCCTRL_COUNT_ENABLED   0
90 #define IRCCTRL_COUNT_DISABLED  1
91 #define IRCCTRL_COUNT_IF_IDX_LO 2
92 #define IRCCTRL_COUNT_IF_IDX_HI 3
93
94 #define IRCCTRL_RESET_DISABLED  0
95 #define IRCCTRL_RESET_ALWAYS    1
96 #define IRCCTRL_RESET_IF_IDX_LO 2
97 #define IRCCTRL_RESET_IF_IDX_HI 3
98 #define IRCCTRL_RESET_IF_IDX_RE 4
99 #define IRCCTRL_RESET_IF_IDX_FE 5
100 #define IRCCTRL_RESET_IF_IDX_BOTH 6
101
102 #define IRCSTATUS_IRC0INDEX_mask        0x00000001
103 #define IRCSTATUS_IRC1INDEX_mask        0x00000100
104 #define IRCSTATUS_IRC2INDEX_mask        0x00000100
105 #define IRCSTATUS_IRC3INDEX_mask        0x00000100
106
107 #define IRCSTATUS_CHANNEL_SHIFT 8
108
109 #define IRCSTATUS_INDEX_mask(ch)        (0x01<<((ch)*IRCSTATUS_CHANNEL_SHIFT))
110
111 #define GPIOC_DACEN_mask        (1 << 26)
112 #define GPIOC_LDAC_mask         (1 << 23)
113 #define GPIOC_EOLC_mask         (1 << 17)
114
115 #define MFST2REG(mfst, bar_num, reg_offs) \
116         ((void *)(mfst->bar##bar_num.virt_addr + (reg_offs)))
117
118
119 typedef struct bar_mapping_t {
120         uintptr_t virt_addr;
121         void *    mmap_addr;
122         off_t     mmap_offset;
123         uintptr_t phys_addr;
124         uint32_t  size;
125         uint32_t  offset;
126 } bar_mapping_t;
127
128
129 typedef enum {DA0, DA1, DA2, DA3, DA4, DA5, DA6, DA7} dac_channel_t;
130 typedef enum {AD0, AD1, AD2, AD3, AD4, AD5, AD6, AD7} adc_channel_t;
131
132 typedef struct mf624_state_t {
133         int device_fd;
134         char *uio_dev;
135         bar_mapping_t bar0;
136         bar_mapping_t bar2;
137         bar_mapping_t bar4;
138         int status;
139         int ADC_enabled; // Which ADCs are enabled
140     int DOut;
141 } mf624_state_t;
142
143 //extern mf624_state_t mf624_state;
144 extern mf624_state_t* mfst;
145
146 static uint32_t dac_channel2reg[] = {
147         [DA0] = DA0_reg,
148         [DA1] = DA1_reg,
149         [DA2] = DA2_reg,
150         [DA3] = DA3_reg,
151         [DA4] = DA4_reg,
152         [DA5] = DA5_reg,
153         [DA6] = DA6_reg,
154         [DA7] = DA7_reg,
155 };
156
157 static uint32_t adc_channel2reg[] = {
158         [AD0] = ADDATA0_reg,
159         [AD1] = ADDATA1_reg,
160         [AD2] = ADDATA2_reg,
161         [AD3] = ADDATA3_reg,
162         [AD4] = ADDATA4_reg,
163         [AD5] = ADDATA5_reg,
164         [AD6] = ADDATA6_reg,
165         [AD7] = ADDATA7_reg,
166 };
167
168 static inline int16_t mf624_read16(void *ptr)
169 {
170         return *(volatile uint16_t*)ptr;
171 }
172
173 static inline int32_t mf624_read32(void *ptr)
174 {
175         return *(volatile uint32_t*) ptr;
176 }
177
178 static inline void mf624_write16(uint16_t val, void *ptr)
179 {
180         *(volatile uint16_t*) ptr = val;
181 }
182
183 static inline void mf624_write32(uint32_t val, void *ptr)
184 {
185         *(volatile uint32_t*) ptr = val;
186 }
187
188 extern void DIO_write(mf624_state_t* mfst, int16_t val);
189
190 extern uint16_t DIO_read(mf624_state_t* mfst);
191
192 extern void DAC_enable(mf624_state_t* mfst);
193
194 extern int DAC_write(mf624_state_t* mfst, dac_channel_t channel, int val);
195
196 extern int ADC_enable(mf624_state_t* mfst, adc_channel_t channel);
197
198 extern double ADC_read(mf624_state_t* mfst, adc_channel_t channel);
199
200 int mf624_init(SimStruct *S);
201 int mf624_check(SimStruct *S);
202 int mf624_done();
203
204 #endif