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