source: rtems/bsps/lm32/shared/milkymist_versions/versions.c @ 21978523

5
Last change on this file since 21978523 was 21978523, checked in by Sebastian Huber <sebastian.huber@…>, on 04/23/18 at 11:31:18

bsps/lm32: Move shared drivers to bsps

This patch is a part of the BSP source reorganization.

Update #3285.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*  versions.c
2 *
3 *  Milkymist versioning driver for RTEMS
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.org/license/LICENSE.
8 *
9 *  COPYRIGHT (c) 2010, 2011 Sebastien Bourdeauducq
10 */
11
12#define RTEMS_STATUS_CHECKS_USE_PRINTK
13
14#include <stdio.h>
15#include <stdlib.h>
16#include <string.h>
17#include <sys/types.h>
18#include <rtems.h>
19#include <rtems/status-checks.h>
20#include <bsp.h>
21#include <rtems/libio.h>
22#include "../include/system_conf.h"
23#include <bsp/milkymist_versions.h>
24
25#define SOC_DEVICE_NAME "/dev/soc"
26#define PCB_DEVICE_NAME "/dev/pcb"
27#define PCBREV_DEVICE_NAME "/dev/pcb_rev"
28
29rtems_device_driver versions_initialize(
30  rtems_device_major_number major,
31  rtems_device_minor_number minor,
32  void *arg
33)
34{
35  rtems_status_code sc;
36
37  sc = rtems_io_register_name(SOC_DEVICE_NAME, major, 0);
38  RTEMS_CHECK_SC(sc, "create SoC version device");
39  sc = rtems_io_register_name(PCB_DEVICE_NAME, major, 1);
40  RTEMS_CHECK_SC(sc, "create PCB type device");
41  sc = rtems_io_register_name(PCBREV_DEVICE_NAME, major, 2);
42  RTEMS_CHECK_SC(sc, "create PCB revision device");
43
44  return RTEMS_SUCCESSFUL;
45}
46
47static int get_soc_version(char *buffer)
48{
49  char fmt[13];
50  char *version;
51  int len;
52  unsigned int id;
53  unsigned int major, minor, subminor, rc;
54
55  id = MM_READ(MM_SYSTEM_ID);
56        major = (id & 0xf0000000) >> 28;
57        minor = (id & 0x0f000000) >> 24;
58        subminor = (id & 0x00f00000) >> 20;
59        rc = (id & 0x000f0000) >> 16;
60
61  version = fmt;
62  version += sprintf(version, "%u.%u", major, minor);
63        if (subminor != 0)
64                version += sprintf(version, ".%u", subminor);
65        if (rc != 0)
66                version += sprintf(version, "RC%u", rc);
67
68  len = version - fmt;
69  memcpy(buffer, fmt, len);
70  return len;
71}
72
73static int get_pcb_type(char *buffer)
74{
75  unsigned int id;
76
77  id = MM_READ(MM_SYSTEM_ID);
78  buffer[0] = (id & 0x0000ff00) >> 8;
79  buffer[1] = id & 0x000000ff;
80  return 2;
81}
82
83static int get_pcb_revision(char *buffer)
84{
85  unsigned int v;
86
87  v = MM_READ(MM_GPIO_IN);
88  v = (v & 0x78) >> 3;
89  buffer[0] = '0' + v;
90  return 1;
91}
92
93rtems_device_driver versions_read(
94  rtems_device_major_number major,
95  rtems_device_minor_number minor,
96  void *arg
97)
98{
99  rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
100
101  if(rw_args->offset != 0) {
102    rw_args->bytes_moved = 0;
103    return RTEMS_SUCCESSFUL;
104  }
105
106  switch (minor) {
107    case 0:
108      if (rw_args->count < 12) {
109        rw_args->bytes_moved = 0;
110        return RTEMS_UNSATISFIED;
111      }
112      rw_args->bytes_moved = get_soc_version((char *)rw_args->buffer);
113      return RTEMS_SUCCESSFUL;
114    case 1:
115      if (rw_args->count < 2) {
116        rw_args->bytes_moved = 0;
117        return RTEMS_UNSATISFIED;
118      }
119      rw_args->bytes_moved = get_pcb_type((char *)rw_args->buffer);
120      return RTEMS_SUCCESSFUL;
121    case 2:
122      if (rw_args->count < 1) {
123        rw_args->bytes_moved = 0;
124        return RTEMS_UNSATISFIED;
125      }
126      rw_args->bytes_moved = get_pcb_revision((char *)rw_args->buffer);
127      return RTEMS_SUCCESSFUL;
128  }
129
130  rw_args->bytes_moved = 0;
131  return RTEMS_UNSATISFIED;
132}
Note: See TracBrowser for help on using the repository browser.