File indexing completed on 2025-05-11 08:24:00
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 #include <bsp.h>
0030 #include <bsp/bootcard.h>
0031 #include <stdio.h>
0032 #include <rtems.h>
0033 #include <rtems/libio.h>
0034 #include <rtems/error.h>
0035 #include <stdlib.h>
0036 #include <string.h>
0037 #include <assert.h>
0038 #include <bsp/fatal.h>
0039 #include <bsp/irq.h>
0040 #include <bsp/niosv.h>
0041
0042 #include <rtems/score/riscv-utility.h>
0043
0044
0045 #define FILE_HEADER_EPCQ_OFFSET 0x100000
0046 #define FILE_HEADER_VER_SIZE_VERSION 11
0047
0048 typedef struct
0049 {
0050 uint32_t offset;
0051 uint32_t size;
0052 uint32_t crc;
0053 char version[FILE_HEADER_VER_SIZE_VERSION];
0054 }file_header_t;
0055
0056
0057 static char software_version[VERSION_SIZE];
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 rtems_device_driver system_initialize (
0071 rtems_device_major_number major,
0072 rtems_device_minor_number minor,
0073 void *arg
0074 )
0075 {
0076
0077 rtems_status_code status;
0078 file_header_t fhead;
0079
0080
0081
0082
0083 status = rtems_io_register_name ("/dev/system", major, minor );
0084 assert( status == RTEMS_SUCCESSFUL );
0085
0086
0087 epcq_read_buffer(
0088 FILE_HEADER_EPCQ_OFFSET,
0089 ( uint8_t * )&fhead,
0090 sizeof( fhead )
0091 );
0092
0093 memset( &software_version[0], 0, sizeof( software_version ));
0094 strncpy( software_version, fhead.version, FILE_HEADER_VER_SIZE_VERSION );
0095
0096 return RTEMS_SUCCESSFUL;
0097 }
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110 rtems_device_driver system_open (
0111 rtems_device_major_number major,
0112 rtems_device_minor_number minor,
0113 void *arg
0114 )
0115 {
0116 return RTEMS_SUCCESSFUL;
0117 }
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130 rtems_device_driver system_close (
0131 rtems_device_major_number major,
0132 rtems_device_minor_number minor,
0133 void *arg
0134 )
0135 {
0136 return RTEMS_SUCCESSFUL;
0137 }
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 rtems_device_driver system_read (
0151 rtems_device_major_number major,
0152 rtems_device_minor_number minor,
0153 void *arg
0154 )
0155 {
0156 return RTEMS_SUCCESSFUL;
0157 }
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170 rtems_device_driver system_write (
0171 rtems_device_major_number major,
0172 rtems_device_minor_number minor,
0173 void *arg
0174 )
0175 {
0176 return RTEMS_SUCCESSFUL;
0177 }
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 rtems_device_driver system_control (
0191 rtems_device_major_number major,
0192 rtems_device_minor_number minor,
0193 void *arg
0194 )
0195 {
0196
0197 rtems_libio_ioctl_args_t *args = arg;
0198 system_control_t *ctrl;
0199
0200
0201 ctrl = ( system_control_t * )args->buffer;
0202 args->ioctl_return = 0;
0203
0204
0205 switch( args->command ) {
0206 case IOCTL_SYSTEM_SOFTWARE_VERSION :
0207 strcpy( ctrl->version, software_version );
0208 break;
0209 case IOCTL_SYSTEM_RESET :
0210 bsp_reset( ( rtems_fatal_source )0, ( rtems_fatal_code )0 );
0211 break;
0212 default :
0213 args->ioctl_return = -1;
0214 break;
0215 }
0216
0217 return RTEMS_SUCCESSFUL;
0218 }