root / Version 2.0 / RS232_MUX.X / hardware_config.h @ 8d73eb8a
Historique | Voir | Annoter | Télécharger (6,928 ko)
1 | 8d73eb8a | Enzo Niro | /*
|
---|---|---|---|
2 | * File: hardware_config.h
|
||
3 | * Author: Enzo Niro
|
||
4 | * Comments: Board configuration library for MUX232
|
||
5 | * Revision history: 1.6
|
||
6 | */
|
||
7 | |||
8 | // This is a guard condition so that contents of this file are not included
|
||
9 | // more than once.
|
||
10 | #ifndef HARDWARE_CFG_H
|
||
11 | #define HARDWARE_CFG_H
|
||
12 | |||
13 | #include <xc.h> // include processor files - each processor file is guarded. |
||
14 | #include "parameters.h" |
||
15 | #include <avr/io.h> |
||
16 | |||
17 | FUSES = { |
||
18 | .WDTCFG = 0x0A, // WDTCFG {PERIOD=4KCLK, WINDOW=OFF} |
||
19 | .BODCFG = 0x00, // BODCFG {SLEEP=DISABLE, ACTIVE=DISABLE, SAMPFREQ=128Hz, LVL=BODLEVEL0} |
||
20 | .OSCCFG = 0x00, // OSCCFG {CLKSEL=OSCHF} |
||
21 | .SYSCFG0 = 0xC0, // SYSCFG0 {EESAVE=CLEAR, RSTPINCFG=GPIO, CRCSEL=CRC16, CRCSRC=NOCRC} |
||
22 | .SYSCFG1 = 0x00, // SYSCFG1 {SUT=0MS} |
||
23 | .CODESIZE = 0x00, // CODESIZE {CODESIZE=User range: 0x0 - 0xFF} |
||
24 | .BOOTSIZE = 0x00, // BOOTSIZE {BOOTSIZE=User range: 0x0 - 0xFF} |
||
25 | }; |
||
26 | |||
27 | LOCKBITS = 0x5CC5C55C; // {KEY=NOLOCK} |
||
28 | |||
29 | |||
30 | |||
31 | typedef struct eepromPort eepromPort; |
||
32 | struct eepromPort
|
||
33 | { |
||
34 | uint8_t regA; // register A for speed and parity configuration
|
||
35 | uint8_t regB; // register B for Data structure and stop bits
|
||
36 | }; |
||
37 | |||
38 | typedef struct cfgPort cfgPort; |
||
39 | struct cfgPort
|
||
40 | { |
||
41 | uint16_t baud; // Port speed
|
||
42 | uint8_t parity; // Parity for frame structure
|
||
43 | uint8_t dataByte; // Data byte structure
|
||
44 | uint8_t stopBit; // Stop bits for frame structure
|
||
45 | }; |
||
46 | |||
47 | //EEPROM data structure (for reading registers)
|
||
48 | eepromPort eepromVCOM[4];
|
||
49 | |||
50 | |||
51 | |||
52 | |||
53 | |||
54 | //Values registers
|
||
55 | |||
56 | #define F5BIT_MODE 0x00 |
||
57 | #define F6BIT_MODE 0x01 |
||
58 | #define F7BIT_MODE 0x02 |
||
59 | #define F8BIT_MODE 0x03 |
||
60 | |||
61 | #define AVR32_NO_PARITY 0x00 |
||
62 | #define AVR32_ODD_PARITY 0x01 //0x03 |
||
63 | #define AVR32_EVEN_PARITY 0x03 //0x02 |
||
64 | #define TL16C_NO_PARITY 0x00 |
||
65 | #define TL16C_ODD_PARITY 0x01 //0x03 |
||
66 | #define TL16C_EVEN_PARITY 0x03 //0x02 |
||
67 | |||
68 | |||
69 | #define ONE_STOPBIT 0x00 |
||
70 | #define TWO_STOPBITS 0x01 |
||
71 | |||
72 | |||
73 | |||
74 | |||
75 | |||
76 | |||
77 | ///////////////////////////
|
||
78 | //Divisor Latch values
|
||
79 | |||
80 | //According to 8MHz
|
||
81 | #ifdef TL16C_8MHZ_CLK
|
||
82 | |||
83 | #define DL_9600_BAUDS 52 |
||
84 | #define DL_19200_BAUDS 26 |
||
85 | #define DL_38400_BAUDS 13 |
||
86 | |||
87 | #else
|
||
88 | #ifdef TL16C_16MHZ_CLK
|
||
89 | |||
90 | #define DL_9600_BAUDS 104 |
||
91 | #define DL_19200_BAUDS 52 |
||
92 | #define DL_38400_BAUDS 26 |
||
93 | |||
94 | #else
|
||
95 | #ifdef TL16C_24MHZ_CLK
|
||
96 | |||
97 | #define DL_9600_BAUDS 156 |
||
98 | #define DL_19200_BAUDS 78 |
||
99 | #define DL_38400_BAUDS 39 |
||
100 | |||
101 | #else
|
||
102 | #error "Please choose a configuration for baud speed" |
||
103 | #define DL_9600_BAUDS 0x0 |
||
104 | #define DL_19200_BAUDS 0x0 |
||
105 | #define DL_38400_BAUDS 0x0 |
||
106 | #define CPU_FREQ_SET 0x0 |
||
107 | |||
108 | #endif //24MHZ |
||
109 | #endif //16MHZ |
||
110 | #endif //8MHZ |
||
111 | |||
112 | |||
113 | |||
114 | //EEPROM addresses
|
||
115 | |||
116 | enum ADDR_BAUDS
|
||
117 | { |
||
118 | ADDR_BAUD_9600 = 0,
|
||
119 | ADDR_BAUD_19200, |
||
120 | ADDR_BAUD_38400, |
||
121 | }; |
||
122 | |||
123 | enum ADDR_PARITY
|
||
124 | { |
||
125 | ADDR_PARITY_NONE = 0,
|
||
126 | ADDR_PARITY_EVEN, |
||
127 | ADDR_PARITY_ODD, |
||
128 | }; |
||
129 | |||
130 | enum ADDR_DATA
|
||
131 | { |
||
132 | ADDR_DATA_F5 = 0,
|
||
133 | ADDR_DATA_F6, |
||
134 | ADDR_DATA_F7, |
||
135 | ADDR_DATA_F8, |
||
136 | }; |
||
137 | |||
138 | enum ADDR_STOPBIT
|
||
139 | { |
||
140 | ADDR_STOP_ONE = 0,
|
||
141 | ADDR_STOP_TWO, |
||
142 | }; |
||
143 | |||
144 | #define DEFAULT_ADDR_BAUD ADDR_BAUD_9600
|
||
145 | #define DEFAULT_ADDR_PARITY ADDR_PARITY_NONE
|
||
146 | #define DEFAULT_ADDR_DATA ADDR_DATA_F8
|
||
147 | #define DEFAULT_ADDR_STOP ADDR_STOP_ONE
|
||
148 | #define DEFAULT_VALUE_DEBUG_LED 0x1F |
||
149 | |||
150 | #define EEPROM_DEBUG_LED_ADDR 0x8 |
||
151 | |||
152 | |||
153 | |||
154 | |||
155 | |||
156 | |||
157 | |||
158 | |||
159 | //////////////////////////////////////////////////
|
||
160 | //EEPROM/CFG function
|
||
161 | void getEEPROMCfg(void); |
||
162 | void setEEPROMCfg(void); |
||
163 | void writeConfiguration(cfgPort *cfg, uint8_t bauds, uint8_t parity, uint8_t dataMode, uint8_t stopBit, uint8_t n);
|
||
164 | void readConfiguration(cfgPort *cfg, uint8_t n);
|
||
165 | //////////////////////////////////////////////////
|
||
166 | |||
167 | |||
168 | |||
169 | |||
170 | |||
171 | |||
172 | |||
173 | |||
174 | |||
175 | |||
176 | /**
|
||
177 | <p><b>void getEEPROMCfg(void)</b></p>
|
||
178 | <p><b>Read eeprom values stored for all serial ports</b></p>
|
||
179 | */
|
||
180 | void getEEPROMCfg(void) |
||
181 | { |
||
182 | uint8_t i = 0, j = 0; |
||
183 | while(j < 8) |
||
184 | { |
||
185 | //Read at first bytes
|
||
186 | eepromVCOM[i].regA = eeprom_read_byte(j); |
||
187 | eeprom_busy_wait(); |
||
188 | eepromVCOM[i].regB = eeprom_read_byte(j+1);
|
||
189 | eeprom_busy_wait(); |
||
190 | //Then check if writing default values is necessary
|
||
191 | if(eepromVCOM[i].regA == 0xFF) |
||
192 | { |
||
193 | eepromVCOM[i].regA = (DEFAULT_ADDR_BAUD << 4) | (DEFAULT_ADDR_PARITY);
|
||
194 | eeprom_write_byte(j, (DEFAULT_ADDR_BAUD << 4) | (DEFAULT_ADDR_PARITY));
|
||
195 | } |
||
196 | if(eepromVCOM[i].regB == 0xFF) |
||
197 | { |
||
198 | eepromVCOM[i].regB = (DEFAULT_ADDR_DATA << 4) | (DEFAULT_ADDR_STOP);
|
||
199 | eeprom_write_byte(j+1, (DEFAULT_ADDR_DATA << 4) | (DEFAULT_ADDR_STOP)); |
||
200 | } |
||
201 | i++; |
||
202 | j+=2;
|
||
203 | } |
||
204 | } |
||
205 | |||
206 | |||
207 | /**
|
||
208 | <p><b>void getEEPROMCfg(void)</b></p>
|
||
209 | <p><b>Write eeprom values stored for all serial ports</b></p>
|
||
210 | */
|
||
211 | void setEEPROMCfg(void) |
||
212 | { |
||
213 | uint8_t i = 0, j = 0; |
||
214 | //Write EEPROM cfg
|
||
215 | while(j < 8) |
||
216 | { |
||
217 | //Read at first bytes
|
||
218 | eeprom_write_byte(j, eepromVCOM[i].regA); |
||
219 | eeprom_busy_wait(); |
||
220 | eeprom_write_byte(j+1, eepromVCOM[i].regB);
|
||
221 | eeprom_busy_wait(); |
||
222 | i++; //next cfg
|
||
223 | j+=2; //next address |
||
224 | } |
||
225 | |||
226 | } |
||
227 | |||
228 | |||
229 | |||
230 | |||
231 | /**
|
||
232 | <p><b>void readConfiguration(cfgPort *cfg, uint8_t n)</b></p>
|
||
233 | <p><b>Get configuration with eeprom read values</b></p>
|
||
234 | <p><b> cfgPort -> Serial port configuration</b></p>
|
||
235 | <p><b> n -> Serial port to configure</b></p>
|
||
236 | */
|
||
237 | void readConfiguration(cfgPort *cfg, uint8_t n)
|
||
238 | { |
||
239 | //BAUD value register for these frequencies in this order :
|
||
240 | //2400, 4800, 9600, 19200, 38400, 57600, 115200
|
||
241 | /*uint16_t speedCfg[] = { DL_9600_BAUDS, DL_19200_BAUDS, DL_38400_BAUDS };
|
||
242 | uint8_t parityCfg[] = { TL16C_NO_PARITY, TL16C_EVEN_PARITY, TL16C_ODD_PARITY };
|
||
243 | uint8_t dataCfg[] = { F5BIT_MODE, F6BIT_MODE, F7BIT_MODE, F8BIT_MODE };
|
||
244 | uint8_t stopCfg[] = { ONE_STOPBIT, TWO_STOPBITS };*/
|
||
245 | |||
246 | cfg->baud = (eepromVCOM[n].regA >> 4);
|
||
247 | cfg->parity = (eepromVCOM[n].regA & 0xF);
|
||
248 | cfg->dataByte = (eepromVCOM[n].regB >> 4);
|
||
249 | cfg->stopBit = (eepromVCOM[n].regB & 0xF);
|
||
250 | } |
||
251 | |||
252 | |||
253 | |||
254 | |||
255 | |||
256 | /**
|
||
257 | <p><b>void readConfiguration(cfgPort *cfg, uint8_t n)</b></p>
|
||
258 | <p><b>Get configuration with eeprom read values</b></p>
|
||
259 | <p><b> cfgPort -> Serial port configuration</b></p>
|
||
260 | <p><b> bauds -> Set bauds speed (9600 / 19200 / 38400)</b></p>
|
||
261 | <p><b> parity -> Set parity Mode (NO_PARITY / EVEN_PARITY / ODD_PARITY)</b></p>
|
||
262 | <p><b> dataMode -> Set number of data bits into frame (5/6/7/8)</b></p>
|
||
263 | <p><b> stopBit -> Set number of stop bits (1/2)</b></p>
|
||
264 | */
|
||
265 | void writeConfiguration(cfgPort *cfg, uint8_t bauds, uint8_t parity, uint8_t dataMode, uint8_t stopBit, uint8_t n)
|
||
266 | { |
||
267 | //BAUD value register for these frequencies in this order :
|
||
268 | //2400, 4800, 9600, 19200, 38400, 57600, 115200
|
||
269 | |||
270 | |||
271 | //Set CFG
|
||
272 | cfg->baud = bauds > 2 ? 2 : bauds; |
||
273 | cfg->parity = parity > 2 ? 2 : parity; |
||
274 | cfg->dataByte = dataMode > 3 ? 3 : dataMode; |
||
275 | cfg->stopBit = stopBit > 1 ? 1 : stopBit; |
||
276 | |||
277 | //Prepare buffer into RAM
|
||
278 | eepromVCOM[n].regA = (cfg->baud << 4) | cfg->parity;
|
||
279 | eepromVCOM[n].regB = (cfg->dataByte << 4) | cfg->stopBit;
|
||
280 | |||
281 | } |
||
282 | |||
283 | |||
284 | #endif /* XC_HEADER_TEMPLATE_H */ |