File indexing completed on 2025-05-11 08:23:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #define RTEMS_STATUS_CHECKS_USE_PRINTK
0013
0014 #include <stdlib.h>
0015 #include <sys/types.h>
0016 #include <rtems.h>
0017 #include <rtems/status-checks.h>
0018 #include <bsp.h>
0019 #include <rtems/libio.h>
0020 #include "../include/system_conf.h"
0021 #include <bsp/milkymist_dmx.h>
0022
0023 #define IN_DEVICE_NAME "/dev/dmx_in"
0024 #define OUT_DEVICE_NAME "/dev/dmx_out"
0025
0026 rtems_device_driver dmx_initialize(
0027 rtems_device_major_number major,
0028 rtems_device_minor_number minor,
0029 void *arg
0030 )
0031 {
0032 rtems_status_code sc;
0033
0034 sc = rtems_io_register_name(IN_DEVICE_NAME, major, 0);
0035 RTEMS_CHECK_SC(sc, "create DMX input device");
0036
0037 sc = rtems_io_register_name(OUT_DEVICE_NAME, major, 1);
0038 RTEMS_CHECK_SC(sc, "create DMX output device");
0039
0040 return RTEMS_SUCCESSFUL;
0041 }
0042
0043 rtems_device_driver dmx_read(
0044 rtems_device_major_number major,
0045 rtems_device_minor_number minor,
0046 void *arg
0047 )
0048 {
0049 rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
0050 int len;
0051 unsigned int i;
0052 unsigned char *values = (unsigned char *)rw_args->buffer;
0053
0054 len = 512 - rw_args->offset;
0055 if (len < 0) {
0056 rw_args->bytes_moved = 0;
0057 return RTEMS_SUCCESSFUL;
0058 }
0059 if (len > rw_args->count)
0060 len = rw_args->count;
0061
0062 if (minor == 0) {
0063 for (i=0;i<len;i++)
0064 values[i] = MM_READ(MM_DMX_RX((unsigned int)rw_args->offset+i));
0065 } else {
0066 for (i=0;i<len;i++)
0067 values[i] = MM_READ(MM_DMX_TX((unsigned int)rw_args->offset+i));
0068 }
0069
0070 rw_args->bytes_moved = len;
0071
0072 return RTEMS_SUCCESSFUL;
0073 }
0074
0075 rtems_device_driver dmx_write(
0076 rtems_device_major_number major,
0077 rtems_device_minor_number minor,
0078 void *arg
0079 )
0080 {
0081 rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
0082 int len;
0083 unsigned int i;
0084 unsigned char *values = (unsigned char *)rw_args->buffer;
0085
0086 if (minor == 0) {
0087 rw_args->bytes_moved = 0;
0088 return RTEMS_UNSATISFIED;
0089 }
0090
0091 len = 512 - rw_args->offset;
0092 if (len < 0) {
0093 rw_args->bytes_moved = 0;
0094 return RTEMS_SUCCESSFUL;
0095 }
0096 if (len > rw_args->count)
0097 len = rw_args->count;
0098
0099 for (i=0;i<len;i++)
0100 MM_WRITE(MM_DMX_TX((unsigned int)rw_args->offset+i), values[i]);
0101
0102 rw_args->bytes_moved = len;
0103
0104 return RTEMS_SUCCESSFUL;
0105 }
0106
0107 rtems_device_driver dmx_control(
0108 rtems_device_major_number major,
0109 rtems_device_minor_number minor,
0110 void *arg
0111 )
0112 {
0113 rtems_libio_ioctl_args_t *args = arg;
0114
0115 switch (args->command) {
0116 case DMX_SET_THRU:
0117 args->ioctl_return = 0;
0118 MM_WRITE(MM_DMX_THRU, (unsigned int)args->buffer);
0119 return RTEMS_SUCCESSFUL;
0120 case DMX_GET_THRU:
0121 args->ioctl_return = 0;
0122 *((unsigned int *)args->buffer) = MM_READ(MM_DMX_THRU);
0123 return RTEMS_SUCCESSFUL;
0124 default:
0125 args->ioctl_return = -1;
0126 return RTEMS_UNSATISFIED;
0127 }
0128 }