4 * Host driver for a serial port attachment, that can be hooked to a character
5 * device, fifo or named pipe.
7 * Copyright (c) 2009 Nathan Keynes.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
31 typedef struct serial_fd_device {
32 struct serial_device dev;
35 gboolean closeOnDestroy;
36 io_listener_t listener;
37 } *serial_fd_device_t;
39 static void serial_fd_device_attach(serial_device_t dev);
40 static void serial_fd_device_detach(serial_device_t dev);
41 static void serial_fd_device_destroy(serial_device_t dev);
42 static void serial_fd_device_set_line_speed(struct serial_device *dev, uint32_t bps);
43 static void serial_fd_device_set_line_params(struct serial_device *dev, int flags);
44 static void serial_fd_device_receive_data(struct serial_device *dev, uint8_t value);
45 static gboolean serial_fd_device_transmit_data( int fd, void *dev);
47 static gboolean serial_config_changed(void *data, struct lxdream_config_group *group, unsigned item,
48 const gchar *oldval, const gchar *newval);
50 struct lxdream_config_group serial_group =
51 { "serial", serial_config_changed, NULL, NULL,
52 {{ "device", N_("Serial device"), CONFIG_TYPE_FILE, "/dev/tty" },
53 { NULL, CONFIG_TYPE_NONE }} };
57 const gchar *name = serial_group.params[0].value;
59 serial_device_t dev = serial_fd_device_new_filename(name);
61 serial_attach_device( dev );
66 static gboolean serial_config_changed(void *data, struct lxdream_config_group *group, unsigned item,
67 const gchar *oldval, const gchar *newval)
70 serial_destroy_device(serial_detach_device());
71 serial_device_t dev = serial_fd_device_new_filename(newval);
73 serial_attach_device( dev );
81 serial_device_t serial_fd_device_new_filename( const gchar *filename )
83 FILE *out = fopen( filename, "w+" );
91 if( fstat( fileno(out), &st ) != 0 ) {
96 if( S_ISCHR(st.st_mode) || S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode) ) {
102 return (serial_device_t)serial_fd_device_new_file(in, out, TRUE);
105 serial_device_t serial_fd_device_new_console()
107 return serial_fd_device_new_file( stdin, stdout, FALSE );
110 serial_device_t serial_fd_device_new_file( FILE *in, FILE *out, gboolean closeOnDestroy )
113 fcntl( fileno(in), F_SETFL, O_NONBLOCK );
115 serial_fd_device_t dev = (serial_fd_device_t)malloc(sizeof(struct serial_fd_device));
117 if( closeOnDestroy ) {
120 if( out != NULL && out != in )
126 dev->dev.attach = serial_fd_device_attach;
127 dev->dev.detach = serial_fd_device_detach;
128 dev->dev.destroy = serial_fd_device_destroy;
129 dev->dev.set_line_speed = serial_fd_device_set_line_speed;
130 dev->dev.set_line_params = serial_fd_device_set_line_params;
131 dev->dev.receive_data = serial_fd_device_receive_data;
134 dev->closeOnDestroy = closeOnDestroy;
135 return (serial_device_t)dev;
138 static void serial_fd_device_attach(serial_device_t dev)
140 serial_fd_device_t fddev = (serial_fd_device_t)dev;
141 if( fddev->in != NULL )
142 fddev->listener = io_register_listener( fileno(fddev->in), serial_fd_device_transmit_data, fddev, NULL );
145 static void serial_fd_device_detach(serial_device_t dev)
147 serial_fd_device_t fddev = (serial_fd_device_t)dev;
148 if( fddev->in != NULL )
149 io_unregister_listener( fddev->listener );
152 static void serial_fd_device_destroy(serial_device_t dev)
154 serial_fd_device_t fddev = (serial_fd_device_t)dev;
155 if( fddev->closeOnDestroy ) {
156 if( fddev->in != NULL )
158 if( fddev->out != NULL && fddev->out != fddev->in )
165 static void serial_fd_device_set_line_speed(struct serial_device *dev, uint32_t bps)
167 /* Do nothing for now */
169 static void serial_fd_device_set_line_params(struct serial_device *dev, int flags)
171 /* Do nothing for now */
173 static void serial_fd_device_receive_data(struct serial_device *dev, uint8_t value)
175 serial_fd_device_t fddev = (serial_fd_device_t)dev;
176 if( fddev->out != NULL )
177 fputc( value, fddev->out );
180 static gboolean serial_fd_device_transmit_data( int fd, void *dev )
182 serial_fd_device_t fddev = (serial_fd_device_t)dev;
184 size_t len = fread(buf, 1, sizeof(buf), fddev->in);
186 serial_transmit_data(buf, len);
.