Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:44

0001 /*  dmx.c
0002  *
0003  *  Milkymist DMX512 driver for RTEMS
0004  *
0005  *  The license and distribution terms for this file may be
0006  *  found in the file LICENSE in this distribution or at
0007  *  http://www.rtems.org/license/LICENSE.
0008  *
0009  *  COPYRIGHT (c) 2010, 2011 Sebastien Bourdeauducq
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 }