source: rtems/c/src/lib/libbsp/arm/beagle/gpio/bbb-gpio.c @ 42989d6

Last change on this file since 42989d6 was 42989d6, checked in by punitvara <punitvara@…>, on Feb 19, 2016 at 6:24:03 PM

arm: Fixed typo in file bbb-gpio.c

This patch fixes typo "moode".

Signed-off: Punit Vara <punitvara@…>

  • Property mode set to 100644
File size: 16.4 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup arm_beagle
5 *
6 * @brief Support for the BeagleBone Black.
7 */
8
9/**
10 * Copyright (c) 2015 Ketul Shah <ketulshah1993 at gmail.com>
11 *
12 * The license and distribution terms for this file may be
13 * found in the file LICENSE in this distribution or at
14 * http://www.rtems.org/license/LICENSE.
15 */
16
17/* BSP specific function definitions for BeagleBone Black.
18 * It is totally beased on Generic GPIO API definition.
19 * For more details related to GPIO API please have a
20 * look at libbbsp/shared/include/gpio.h
21 */
22
23#include <bsp/beagleboneblack.h>
24#include <bsp/irq-generic.h>
25#include <bsp/gpio.h>
26#include <bsp/bbb-gpio.h>
27#include <libcpu/am335x.h>
28
29#include <assert.h>
30#include <stdlib.h>
31
32/* Currently these definitions are for BeagleBone Black board only
33 * Later on Beagle-xM board support can be added in this code.
34 * After support gets added if condition should be removed
35 */
36#if IS_AM335X
37
38static const uint32_t gpio_bank_addrs[] = 
39  { AM335X_GPIO0_BASE,
40        AM335X_GPIO1_BASE, 
41        AM335X_GPIO2_BASE, 
42        AM335X_GPIO3_BASE };
43
44static const rtems_vector_number gpio_bank_vector[] =
45  { AM335X_INT_GPIOINT0A,
46        AM335X_INT_GPIOINT1A,
47        AM335X_INT_GPIOINT2A,
48        AM335X_INT_GPIOINT3A };
49
50/* Macro for the gpio pin not having control module offset mapping */
51#define CONF_NOT_DEFINED 0x00000000
52
53/* Mapping of gpio pin nuber to the  Control module mapped register offset */
54static const uint32_t gpio_pad_conf[GPIO_BANK_COUNT][BSP_GPIO_PINS_PER_BANK] =
55{
56  /* GPIO Module 0 */
57  { CONF_NOT_DEFINED,             /* GPIO0[0] */
58    CONF_NOT_DEFINED,             /* GPIO0[1] */
59    AM335X_CONF_SPI0_SCLK,        /* GPIO0[2] */
60    AM335X_CONF_SPI0_D0,          /* GPIO0[3] */
61    AM335X_CONF_SPI0_D1,          /* GPIO0[4] */
62    AM335X_CONF_SPI0_CS0,         /* GPIO0[5] */
63    CONF_NOT_DEFINED,             /* GPIO0[6] */
64    CONF_NOT_DEFINED,             /* GPIO0[7] */
65    AM335X_CONF_LCD_DATA12,       /* GPIO0[8] */
66    AM335X_CONF_LCD_DATA13,       /* GPIO0[9] */
67    AM335X_CONF_LCD_DATA14,       /* GPIO0[10] */
68    AM335X_CONF_LCD_DATA15,       /* GPIO0[11] */
69    AM335X_CONF_UART1_CTSN,       /* GPIO0[12] */
70    AM335X_CONF_UART1_RTSN,       /* GPIO0[13] */
71    AM335X_CONF_UART1_RXD,        /* GPIO0[14] */
72    AM335X_CONF_UART1_TXD,        /* GPIO0[15] */
73    CONF_NOT_DEFINED,             /* GPIO0[16] */
74    CONF_NOT_DEFINED,             /* GPIO0[17] */
75    CONF_NOT_DEFINED,             /* GPIO0[18] */
76    CONF_NOT_DEFINED,             /* GPIO0[19] */
77    CONF_NOT_DEFINED,             /* GPIO0[20] */
78    CONF_NOT_DEFINED,             /* GPIO0[21] */
79    AM335X_CONF_GPMC_AD8,         /* GPIO0[22] */
80    AM335X_CONF_GPMC_AD9,         /* GPIO0[23] */
81    CONF_NOT_DEFINED,             /* GPIO0[24] */
82    CONF_NOT_DEFINED,             /* GPIO0[25] */
83    AM335X_CONF_GPMC_AD10,        /* GPIO0[26] */
84    AM335X_CONF_GPMC_AD11,        /* GPIO0[27] */
85    CONF_NOT_DEFINED,             /* GPIO0[28] */
86    CONF_NOT_DEFINED,             /* GPIO0[29] */
87    AM335X_CONF_GPMC_WAIT0,       /* GPIO0[30] */
88    AM335X_CONF_GPMC_WPN          /* GPIO0[31] */ },
89 
90  /* GPIO Module 1 */
91  { AM335X_CONF_GPMC_AD0,         /* GPIO1[0] */
92    AM335X_CONF_GPMC_AD1,         /* GPIO1[1] */
93    AM335X_CONF_GPMC_AD2,         /* GPIO1[2] */
94    AM335X_CONF_GPMC_AD3,         /* GPIO1[3] */
95    AM335X_CONF_GPMC_AD4,         /* GPIO1[4] */
96    AM335X_CONF_GPMC_AD5,         /* GPIO1[5] */
97    AM335X_CONF_GPMC_AD6,         /* GPIO1[6] */
98    AM335X_CONF_GPMC_AD7,         /* GPIO1[7] */
99    CONF_NOT_DEFINED,             /* GPIO1[8] */
100    CONF_NOT_DEFINED,             /* GPIO1[9] */
101    CONF_NOT_DEFINED,             /* GPIO1[10] */
102    CONF_NOT_DEFINED,             /* GPIO1[11] */
103    AM335X_CONF_GPMC_AD12,        /* GPIO1[12] */
104    AM335X_CONF_GPMC_AD13,        /* GPIO1[13] */
105    AM335X_CONF_GPMC_AD14,        /* GPIO1[14] */
106    AM335X_CONF_GPMC_AD15,        /* GPIO1[15] */
107    AM335X_CONF_GPMC_A0,          /* GPIO1[16] */
108    AM335X_CONF_GPMC_A1,          /* GPIO1[17] */
109    AM335X_CONF_GPMC_A2,          /* GPIO1[18] */
110    AM335X_CONF_GPMC_A3,          /* GPIO1[19] */
111    CONF_NOT_DEFINED,             /* GPIO1[20] */
112    CONF_NOT_DEFINED,             /* GPIO1[21] */
113    CONF_NOT_DEFINED,             /* GPIO1[22] */
114    CONF_NOT_DEFINED,             /* GPIO1[23] */
115    CONF_NOT_DEFINED,             /* GPIO1[24] */
116    CONF_NOT_DEFINED,             /* GPIO1[25] */
117    CONF_NOT_DEFINED,             /* GPIO1[26] */
118    CONF_NOT_DEFINED,             /* GPIO1[27] */
119    AM335X_CONF_GPMC_BEN1,        /* GPIO1[28] */
120    AM335X_CONF_GPMC_CSN0,        /* GPIO1[29] */
121    AM335X_CONF_GPMC_CSN1,        /* GPIO1[30] */
122    AM335X_CONF_GPMC_CSN2         /* GPIO1[31] */ },
123
124  /* GPIO Module 2 */
125  { CONF_NOT_DEFINED,             /* GPIO2[0] */
126    AM335X_CONF_GPMC_CLK,         /* GPIO2[1] */
127    AM335X_CONF_GPMC_ADVN_ALE,    /* GPIO2[2] */
128    AM335X_CONF_GPMC_OEN_REN,     /* GPIO2[3] */
129    AM335X_CONF_GPMC_WEN,         /* GPIO2[4] */
130    AM335X_CONF_GPMC_BEN0_CLE,    /* GPIO2[5] */
131    AM335X_CONF_LCD_DATA0,        /* GPIO2[6] */
132    AM335X_CONF_LCD_DATA1,        /* GPIO2[7] */
133    AM335X_CONF_LCD_DATA2,        /* GPIO2[8] */
134    AM335X_CONF_LCD_DATA3,        /* GPIO2[9] */
135    AM335X_CONF_LCD_DATA4,        /* GPIO2[10] */
136    AM335X_CONF_LCD_DATA5,        /* GPIO2[11] */
137    AM335X_CONF_LCD_DATA6,        /* GPIO2[12] */
138    AM335X_CONF_LCD_DATA7,        /* GPIO2[13] */
139    AM335X_CONF_LCD_DATA8,        /* GPIO2[14] */
140    AM335X_CONF_LCD_DATA9,        /* GPIO2[15] */
141    AM335X_CONF_LCD_DATA10,       /* GPIO2[16] */
142    AM335X_CONF_LCD_DATA11,       /* GPIO2[17] */
143    CONF_NOT_DEFINED,             /* GPIO2[18] */
144    CONF_NOT_DEFINED,             /* GPIO2[19] */
145    CONF_NOT_DEFINED,             /* GPIO2[20] */
146    CONF_NOT_DEFINED,             /* GPIO2[21] */
147    AM335X_CONF_LCD_VSYNC,        /* GPIO2[22] */
148    AM335X_CONF_LCD_HSYNC,        /* GPIO2[23] */
149    AM335X_CONF_LCD_PCLK,         /* GPIO2[24] */
150    AM335X_CONF_LCD_AC_BIAS_EN    /* GPIO2[25] */ },
151
152  /* GPIO Module 3 */
153  { CONF_NOT_DEFINED,             /* GPIO3[0] */
154    CONF_NOT_DEFINED,             /* GPIO3[1] */
155    CONF_NOT_DEFINED,             /* GPIO3[2] */
156    CONF_NOT_DEFINED,             /* GPIO3[3] */
157    CONF_NOT_DEFINED,             /* GPIO3[4] */
158    CONF_NOT_DEFINED,             /* GPIO3[5] */
159    CONF_NOT_DEFINED,             /* GPIO3[6] */
160    CONF_NOT_DEFINED,             /* GPIO3[7] */
161    CONF_NOT_DEFINED,             /* GPIO3[8] */
162    CONF_NOT_DEFINED,             /* GPIO3[9] */
163    CONF_NOT_DEFINED,             /* GPIO3[10] */
164    CONF_NOT_DEFINED,             /* GPIO3[11] */
165    CONF_NOT_DEFINED,             /* GPIO3[12] */
166    CONF_NOT_DEFINED,             /* GPIO3[13] */
167    AM335X_CONF_MCASP0_ACLKX,     /* GPIO3[14] */
168    AM335X_CONF_MCASP0_FSX,       /* GPIO3[15] */
169    AM335X_CONF_MCASP0_AXR0,      /* GPIO3[16] */
170    AM335X_CONF_MCASP0_AHCLKR,    /* GPIO3[17] */
171    CONF_NOT_DEFINED,             /* GPIO3[18] */
172    AM335X_CONF_MCASP0_FSR,       /* GPIO3[19] */
173    CONF_NOT_DEFINED,             /* GPIO3[20] */
174    AM335X_CONF_MCASP0_AHCLKX     /* GPIO3[21] */ }
175};
176
177/* Get the address of Base Register + Offset for pad config */
178uint32_t static inline bbb_conf_reg(uint32_t bank, uint32_t pin)
179{
180  return (AM335X_PADCONF_BASE + gpio_pad_conf[bank][pin]);
181}
182
183/* Get the value of Base Register + Offset */
184uint32_t static inline bbb_reg(uint32_t bank, uint32_t reg)
185{
186  return (gpio_bank_addrs[bank] + reg);
187}
188
189static rtems_status_code bbb_select_pin_function(
190  uint32_t bank,
191  uint32_t pin,
192  uint32_t type
193) {
194
195  if ( type == BBB_DIGITAL_IN ) {
196    mmio_set(bbb_reg(bank, AM335X_GPIO_OE), BIT(pin));
197  } else {
198    mmio_clear(bbb_reg(bank, AM335X_GPIO_OE), BIT(pin));
199  }
200
201  return RTEMS_SUCCESSFUL;
202}
203
204rtems_status_code rtems_gpio_bsp_multi_set(uint32_t bank, uint32_t bitmask)
205{
206  mmio_set(bbb_reg(bank, AM335X_GPIO_SETDATAOUT), bitmask);
207
208  return RTEMS_SUCCESSFUL;
209}
210
211rtems_status_code rtems_gpio_bsp_multi_clear(uint32_t bank, uint32_t bitmask)
212{
213  mmio_set(bbb_reg(bank, AM335X_GPIO_CLEARDATAOUT), bitmask);
214
215  return RTEMS_SUCCESSFUL;
216}
217
218uint32_t rtems_gpio_bsp_multi_read(uint32_t bank, uint32_t bitmask)
219{
220  return (bbb_reg(bank, AM335X_GPIO_DATAIN) & bitmask);
221}
222
223rtems_status_code rtems_gpio_bsp_set(uint32_t bank, uint32_t pin)
224{
225  mmio_set(bbb_reg(bank, AM335X_GPIO_SETDATAOUT), BIT(pin));
226
227  return RTEMS_SUCCESSFUL;
228}
229
230rtems_status_code rtems_gpio_bsp_clear(uint32_t bank, uint32_t pin)
231{
232  mmio_set(bbb_reg(bank, AM335X_GPIO_CLEARDATAOUT), BIT(pin));
233
234  return RTEMS_SUCCESSFUL;
235}
236
237uint32_t rtems_gpio_bsp_get_value(uint32_t bank, uint32_t pin)
238{
239  return (mmio_read(bbb_reg(bank, AM335X_GPIO_DATAIN)) & BIT(pin));
240}
241
242rtems_status_code rtems_gpio_bsp_select_input(
243  uint32_t bank,
244  uint32_t pin,
245  void *bsp_specific
246) {
247  return bbb_select_pin_function(bank, pin, BBB_DIGITAL_IN);
248}
249
250rtems_status_code rtems_gpio_bsp_select_output(
251  uint32_t bank,
252  uint32_t pin,
253  void *bsp_specific
254) {
255  return bbb_select_pin_function(bank, pin, BBB_DIGITAL_OUT);
256}
257
258rtems_status_code rtems_gpio_bsp_select_specific_io(
259  uint32_t bank,
260  uint32_t pin,
261  uint32_t function,
262  void *pin_data
263) {
264  return RTEMS_NOT_DEFINED;
265}
266
267rtems_status_code rtems_gpio_bsp_set_resistor_mode(
268  uint32_t bank,
269  uint32_t pin,
270  rtems_gpio_pull_mode mode
271) {
272  /* TODO: Add support for setting up resistor mode */
273  return RTEMS_NOT_DEFINED;
274}
275
276rtems_vector_number rtems_gpio_bsp_get_vector(uint32_t bank)
277{
278  return gpio_bank_vector[bank];
279}
280
281uint32_t rtems_gpio_bsp_interrupt_line(rtems_vector_number vector)
282{
283  uint32_t event_status;
284  uint8_t bank_nr = 0;
285
286  /* Following loop will get the bank number from vector number */
287  while (bank_nr < GPIO_BANK_COUNT && vector != gpio_bank_vector[bank_nr])
288  {
289        bank_nr++;
290  }
291
292  /* Retrieve the interrupt event status. */
293  event_status = mmio_read(bbb_reg(bank_nr, AM335X_GPIO_IRQSTATUS_0));
294
295  /* Clear the interrupt line. */
296  mmio_write(
297    (bbb_reg(bank_nr, AM335X_GPIO_IRQSTATUS_0)), event_status);
298 
299  return event_status;
300}
301
302rtems_status_code rtems_gpio_bsp_enable_interrupt(
303  uint32_t bank,
304  uint32_t pin,
305  rtems_gpio_interrupt interrupt
306) {
307 
308  /* Enable IRQ generation for the specific pin */
309  mmio_set(bbb_reg(bank, AM335X_GPIO_IRQSTATUS_SET_0), BIT(pin));
310 
311  switch ( interrupt ) {
312    case FALLING_EDGE:
313      /* Enables asynchronous falling edge detection. */
314      mmio_set(bbb_reg(bank, AM335X_GPIO_FALLINGDETECT), BIT(pin));
315      break;
316    case RISING_EDGE:
317      /* Enables asynchronous rising edge detection. */
318      mmio_set(bbb_reg(bank, AM335X_GPIO_RISINGDETECT), BIT(pin));
319      break;
320    case BOTH_EDGES:
321      /* Enables asynchronous falling edge detection. */
322      mmio_set(bbb_reg(bank, AM335X_GPIO_FALLINGDETECT), BIT(pin));
323
324      /* Enables asynchronous rising edge detection. */
325      mmio_set(bbb_reg(bank, AM335X_GPIO_RISINGDETECT), BIT(pin));
326      break;
327    case LOW_LEVEL:
328      /* Enables pin low level detection. */
329      mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT0), BIT(pin));
330      break;
331    case HIGH_LEVEL:
332       /* Enables pin high level detection. */
333      mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT1), BIT(pin));
334      break;
335    case BOTH_LEVELS:
336      /* Enables pin low level detection. */
337      mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT0), BIT(pin));
338
339      /* Enables pin high level detection. */
340      mmio_set(bbb_reg(bank, AM335X_GPIO_LEVELDETECT1), BIT(pin));
341      break;
342    case NONE:
343    default:
344      return RTEMS_UNSATISFIED;
345  }
346
347  /* The detection starts after 5 clock cycles as per AM335X TRM
348   * This period is required to clean the synchronization edge/
349   * level detection pipeline
350   */
351  asm volatile("nop"); asm volatile("nop"); asm volatile("nop");
352  asm volatile("nop"); asm volatile("nop");
353 
354  return RTEMS_SUCCESSFUL;
355}
356
357rtems_status_code rtems_gpio_bsp_disable_interrupt(
358  uint32_t bank,
359  uint32_t pin,
360  rtems_gpio_interrupt interrupt
361) {
362  /* Clear IRQ generation for the specific pin */
363  mmio_write(bbb_reg(bank, AM335X_GPIO_IRQSTATUS_CLR_0), BIT(pin));
364
365  switch ( interrupt ) {
366    case FALLING_EDGE:
367      /* Disables asynchronous falling edge detection. */
368      mmio_clear(bbb_reg(bank, AM335X_GPIO_FALLINGDETECT), BIT(pin));
369      break;
370    case RISING_EDGE:
371      /* Disables asynchronous rising edge detection. */
372      mmio_clear(bbb_reg(bank, AM335X_GPIO_RISINGDETECT), BIT(pin));
373      break;
374    case BOTH_EDGES:
375      /* Disables asynchronous falling edge detection. */
376      mmio_clear(bbb_reg(bank, AM335X_GPIO_FALLINGDETECT), BIT(pin));
377
378      /* Disables asynchronous rising edge detection. */
379      mmio_clear(bbb_reg(bank, AM335X_GPIO_RISINGDETECT), BIT(pin));
380      break;
381    case LOW_LEVEL:
382      /* Disables pin low level detection. */
383      mmio_clear(bbb_reg(bank, AM335X_GPIO_LEVELDETECT0), BIT(pin));
384      break;
385    case HIGH_LEVEL:
386      /* Disables pin high level detection. */
387       mmio_clear(bbb_reg(bank, AM335X_GPIO_LEVELDETECT1), BIT(pin));
388      break;
389    case BOTH_LEVELS:
390      /* Disables pin low level detection. */
391      mmio_clear(bbb_reg(bank, AM335X_GPIO_LEVELDETECT0), BIT(pin));
392
393      /* Disables pin high level detection. */
394      mmio_clear(bbb_reg(bank, AM335X_GPIO_LEVELDETECT1), BIT(pin));
395      break;
396    case NONE:
397    default:
398      return RTEMS_UNSATISFIED;
399  }
400
401  /* The detection starts after 5 clock cycles as per AM335X TRM
402   * This period is required to clean the synchronization edge/
403   * level detection pipeline
404   */
405  asm volatile("nop"); asm volatile("nop"); asm volatile("nop");
406  asm volatile("nop"); asm volatile("nop");
407
408  return RTEMS_SUCCESSFUL;
409}
410
411rtems_status_code rtems_gpio_bsp_multi_select(
412  rtems_gpio_multiple_pin_select *pins,
413  uint32_t pin_count,
414  uint32_t select_bank
415) {
416  uint32_t register_address;
417  uint32_t select_register;
418  uint8_t i;
419
420  register_address = gpio_bank_addrs[select_bank] + AM335X_GPIO_OE;
421
422  select_register = REG(register_address);
423
424  for ( i = 0; i < pin_count; ++i ) {
425    if ( pins[i].function == DIGITAL_INPUT ) {
426      select_register |= BIT(pins[i].pin_number);
427    } else if ( pins[i].function == DIGITAL_OUTPUT ) {
428      select_register &= ~BIT(pins[i].pin_number);
429    } else { /* BSP_SPECIFIC function. */
430      return RTEMS_NOT_DEFINED;
431    }
432  }
433
434  REG(register_address) = select_register;
435
436  return RTEMS_SUCCESSFUL;
437}
438
439rtems_status_code rtems_gpio_bsp_specific_group_operation(
440  uint32_t bank,
441  uint32_t *pins,
442  uint32_t pin_count,
443  void *arg
444) {
445  return RTEMS_NOT_DEFINED;
446}
447
448#endif /* IS_AM335X */
449
450/* For support of BeagleboardxM */
451#if IS_DM3730
452
453/* Currently this section is just to satisfy
454 * GPIO API and to make the build successful.
455 * Later on support can be added here.
456 */
457
458rtems_status_code rtems_gpio_bsp_multi_set(uint32_t bank, uint32_t bitmask)
459{
460  return RTEMS_NOT_DEFINED;
461}
462
463rtems_status_code rtems_gpio_bsp_multi_clear(uint32_t bank, uint32_t bitmask)
464{
465  return RTEMS_NOT_DEFINED;
466}
467
468uint32_t rtems_gpio_bsp_multi_read(uint32_t bank, uint32_t bitmask)
469{
470  return -1;
471}
472
473rtems_status_code rtems_gpio_bsp_set(uint32_t bank, uint32_t pin)
474{
475  return RTEMS_NOT_DEFINED;
476}
477
478rtems_status_code rtems_gpio_bsp_clear(uint32_t bank, uint32_t pin)
479{
480  return RTEMS_NOT_DEFINED;
481}
482
483uint32_t rtems_gpio_bsp_get_value(uint32_t bank, uint32_t pin)
484{
485  return -1;
486}
487
488rtems_status_code rtems_gpio_bsp_select_input(
489  uint32_t bank,
490  uint32_t pin,
491  void *bsp_specific
492) {
493  return RTEMS_NOT_DEFINED;
494}
495
496rtems_status_code rtems_gpio_bsp_select_output(
497  uint32_t bank,
498  uint32_t pin,
499  void *bsp_specific
500) {
501  return RTEMS_NOT_DEFINED;
502}
503
504rtems_status_code rtems_gpio_bsp_select_specific_io(
505  uint32_t bank,
506  uint32_t pin,
507  uint32_t function,
508  void *pin_data
509) {
510  return RTEMS_NOT_DEFINED;
511}
512
513rtems_status_code rtems_gpio_bsp_set_resistor_mode(
514  uint32_t bank,
515  uint32_t pin,
516  rtems_gpio_pull_mode mode
517) {
518  return RTEMS_NOT_DEFINED;
519}
520
521rtems_vector_number rtems_gpio_bsp_get_vector(uint32_t bank)
522{
523  return -1;
524}
525
526uint32_t rtems_gpio_bsp_interrupt_line(rtems_vector_number vector)
527{
528  return -1;
529}
530
531rtems_status_code rtems_gpio_bsp_enable_interrupt(
532  uint32_t bank,
533  uint32_t pin,
534  rtems_gpio_interrupt interrupt
535) {
536  return RTEMS_NOT_DEFINED;
537}
538
539rtems_status_code rtems_gpio_bsp_disable_interrupt(
540  uint32_t bank,
541  uint32_t pin,
542  rtems_gpio_interrupt interrupt
543) {
544  return RTEMS_NOT_DEFINED;
545}
546
547rtems_status_code rtems_gpio_bsp_multi_select(
548  rtems_gpio_multiple_pin_select *pins,
549  uint32_t pin_count,
550  uint32_t select_bank
551) {
552  return RTEMS_NOT_DEFINED;
553}
554
555rtems_status_code rtems_gpio_bsp_specific_group_operation(
556  uint32_t bank,
557  uint32_t *pins,
558  uint32_t pin_count,
559  void *arg
560) {
561  return RTEMS_NOT_DEFINED;
562}
563
564#endif /* IS_DM3730 */
Note: See TracBrowser for help on using the repository browser.