[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [PATCH] serial
Und hier nochmal nen Bugfix, damit unbrauchbare Dateinamen nicht verwendet
werden.
Am Sonntag, 19. Oktober 2008 00:26:34 schrieben Sie:
> cdi.fs-Treiber serial für die standardmäßigen RS-232 im System. Zum
> ausprobieren, starten und pipe -a serial:/1/115200,8n1 - Parameter nach
> Wünschen anpassbar.
Index: src/modules/cdi/serial/dir.c
===================================================================
--- src/modules/cdi/serial/dir.c (Revision 0)
+++ src/modules/cdi/serial/dir.c (Revision 0)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <string.h>
+
+#include "cdi/lists.h"
+
+#include "serial_cdi.h"
+
+
+cdi_list_t serial_fs_dir_list(struct cdi_fs_stream* stream)
+{
+ return stream->res->children;
+}
+
+int serial_fs_dir_create_child(struct cdi_fs_stream* stream, const char* name,
+ struct cdi_fs_res* parent)
+{
+ struct serial_fs_res* res = malloc(sizeof(*res));
+ struct serial_fs_res* parent_res = (struct serial_fs_res*) parent;
+
+ if (parent_res->in_use != 0)
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+
+ memset(res, 0, sizeof(*res));
+
+ res->res.loaded = 1;
+ res->res.name = strdup(name);
+ res->res.res = &serial_fs_res;
+ res->res.children = cdi_list_create();
+
+ cdi_list_push(parent_res->res.children, res);
+ res->res.parent = parent;
+ parent_res->in_use++;
+
+ stream->res = (struct cdi_fs_res*) res;
+ return 1;
+}
Index: src/modules/cdi/serial/serial.c
===================================================================
--- src/modules/cdi/serial/serial.c (Revision 0)
+++ src/modules/cdi/serial/serial.c (Revision 0)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "serial.h"
+#include "cdi.h"
+#include "cdi/io.h"
+#include "cdi/misc.h"
+
+// Basisadressen.
+uint16_t COM1_BASE = 0x3F8;
+uint16_t COM2_BASE = 0x2F8;
+uint16_t COM3_BASE = 0x3E8;
+uint16_t COM4_BASE = 0x2E8;
+
+/**
+ * Oeffnet einen Port an der angegeben Basisadresse unter angegeben Optionen.
+ * @param base Basisport (Wird nicht geprueft!)
+ * @param baudrate Baudrate halt. 115200 Maximal.
+ * @param parity Paritaet.
+ * @param bits Anzahl der Datenbits einer Uebertragung. 5-8
+ * @param stopbits Anzahl der Stopbits
+ * @return 0 bei Erfolg, sonst -1
+ */
+int serial_init(uint16_t base, uint32_t baudrate, uint8_t bits, uint8_t parity,
+ uint8_t stopbits)
+{
+ uint16_t divisor = 0;
+ int ports_allocated = -1;
+
+ // Baudrate pruefen
+ if (baudrate > 115200)
+ return -1;
+
+ // Ports holen
+ ports_allocated = cdi_ioports_alloc(base, 8);
+ if (ports_allocated == -1)
+ return -1;
+
+ // Interrupts deaktivieren
+ cdi_outb(base+REG_IER,0x00);
+
+ // DLAB setzen
+ cdi_outb(base+REG_LCR,0x80);
+
+ // Baudrate setzen
+ divisor = 115200 / baudrate;
+ cdi_outw(base, divisor);
+
+ // Anzahl Bits, Paritaet, usw setzen (DLAB zurücksetzen)
+ cdi_outb(base+REG_LCR,((parity&0x7)<<3)|((bits-5)&0x3)|((stopbits&0x1)<<2));
+
+ // Initialisierung abschließen
+ cdi_outb(base+REG_FCR,0xC7);
+ cdi_outb(base+REG_MCR,0x0B);
+
+ return 0;
+}
+
+/**
+ * Sendet ein uint8 an den Port
+ * @param base Der IO-Port der Schnittstelle an die etwas geschickt werden soll.
+ * @param data uint8 an Daten
+ */
+void serial_send(uint16_t base, uint8_t data)
+{
+ cdi_outb(base,data);
+}
+
+/**
+ * Prueft ob gesendet werden kann (1 Byte!)
+ * @param base Der IO-Port der Schnittstelle, auf der gesendet werden soll.
+ */
+int serial_can_send(uint16_t base)
+{
+ if ((cdi_inb(base+REG_LSR)&0x20)==0)
+ return 0;
+ else
+ return 1;
+}
+
+/**
+ * Liest ein uint8 von dem Port
+ * @param base Der IO-Port der Schnittstelle von der gelesen werden soll.
+ */
+uint8_t serial_recv(uint16_t base)
+{
+ return cdi_inb(base);
+}
+
+/**
+ * Prueft, ob ein uint8 von dem Port gelesen werden kann.
+ * @param base Der IO-Port der Schnittstelle von der gelesen werden soll.
+ */
+int serial_can_recv(uint16_t base)
+{
+ return (cdi_inb(base+REG_LSR)&1);
+}
+
+/**
+ * Gibt den Port wieder frei.
+ * @param base Der IO-Port der Schnittstelle die Freigegeben werden soll.
+ */
+void serial_free(uint16_t base)
+{
+ cdi_ioports_free(base, 8);
+}
Index: src/modules/cdi/serial/file.c
===================================================================
--- src/modules/cdi/serial/file.c (Revision 0)
+++ src/modules/cdi/serial/file.c (Revision 0)
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "serial_cdi.h"
+#include "serial.h"
+#include "stdio.h"
+#include "cdi/misc.h"
+
+size_t serial_fs_file_read(struct cdi_fs_stream* stream, uint64_t start,
+ size_t size, void* data)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+ struct serial_fs_res* parent = (struct serial_fs_res*) res->res.parent;
+ size_t ptr = 0;
+ int retry = 0;
+
+ if (parent->baseport != 0)
+ {
+ while (ptr < size)
+ {
+ if (serial_can_recv(parent->baseport))
+ {
+ ((uint8_t*)data)[ptr++] = serial_recv(parent->baseport);
+ retry = 0;
+ }
+ else
+ {
+ // Timeout-Ersatz, bei zu schnellen Rechnern benoetigt um
+ // brauchbar zu lesen.
+ retry++;
+ if (retry > 3)
+ {
+ stream->error = CDI_FS_ERROR_EOF;
+ return ptr;
+ }
+ else
+ {
+ cdi_sleep_ms(1);
+ }
+ }
+ }
+ }
+ else
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+ return size;
+}
+
+size_t serial_fs_file_write(struct cdi_fs_stream* stream, uint64_t start,
+ size_t size, const void* data)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+ struct serial_fs_res* parent = (struct serial_fs_res*) res->res.parent;
+
+ if (parent->baseport != 0)
+ {
+ size_t ptr = 0;
+ while (ptr < size)
+ {
+ if (serial_can_send(parent->baseport))
+ {
+ serial_send(parent->baseport, *(uint8_t*)(data + ptr++));
+ }
+ }
+ }
+ else
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+ return size;
+}
+
+int serial_fs_file_truncate(struct cdi_fs_stream* stream, uint64_t size)
+{
+ return 0;
+}
Index: src/modules/cdi/serial/Makefile.all
===================================================================
--- src/modules/cdi/serial/Makefile.all (Revision 0)
+++ src/modules/cdi/serial/Makefile.all (Revision 0)
@@ -0,0 +1,6 @@
+shopt -s extglob
+source $LOST_BUILDMK_ROOT/config.sh
+
+echo "LD $1/modules/serial"
+$LOST_TOOLS_LD -oserial.mod -Ttext=0x40000000 *.o --start-group $2 --end-group
+$LOST_TOOLS_STRIP -s serial.mod -o $1/modules/serial
Index: src/modules/cdi/serial/serial_cdi.h
===================================================================
--- src/modules/cdi/serial/serial_cdi.h (Revision 0)
+++ src/modules/cdi/serial/serial_cdi.h (Revision 0)
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _SERIAL_CDI_H_
+#define _SERIAL_CDI_H_
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include "cdi/fs.h"
+
+/**
+ * Dateisystemressource fuer serial
+ */
+struct serial_fs_res {
+ struct cdi_fs_res res;
+
+ // Basisport
+ uint16_t baseport;
+ int in_use;
+};
+
+
+// CDI-IF
+int serial_fs_init(struct cdi_fs_filesystem* fs);
+int serial_fs_destroy(struct cdi_fs_filesystem* fs);
+
+// CDI Res
+int serial_fs_res_load(struct cdi_fs_stream* stream);
+int serial_fs_res_unload(struct cdi_fs_stream* stream);
+int serial_fs_res_remove(struct cdi_fs_stream* stream);
+int serial_fs_res_rename(struct cdi_fs_stream* stream, const char* name);
+//int serial_fs_res_move(struct cdi_fs_stream* stream, struct cdi_fs_res* dest);
+int serial_fs_res_assign_class(struct cdi_fs_stream* stream,
+ cdi_fs_res_class_t class);
+int serial_fs_res_remove_class(struct cdi_fs_stream* stream,
+ cdi_fs_res_class_t class);
+int64_t serial_fs_res_meta_read(struct cdi_fs_stream* stream, cdi_fs_meta_t meta);
+int serial_fs_res_meta_write(struct cdi_fs_stream* stream, cdi_fs_meta_t meta,
+ int64_t value);
+int serial_fs_res_destroy(struct serial_fs_res* res);
+
+// CDI File
+size_t serial_fs_file_read(struct cdi_fs_stream* stream, uint64_t start,
+ size_t size, void* data);
+size_t serial_fs_file_write(struct cdi_fs_stream* stream, uint64_t start,
+ size_t size, const void* data);
+int serial_fs_file_truncate(struct cdi_fs_stream* stream, uint64_t size);
+
+// CDI Dir
+cdi_list_t serial_fs_dir_list(struct cdi_fs_stream* stream);
+int serial_fs_dir_create_child(struct cdi_fs_stream* stream,
+ const char* name, struct cdi_fs_res* parent);
+
+// CDI Link
+const char* serial_fs_link_read(struct cdi_fs_stream* stream);
+int serial_fs_link_write(struct cdi_fs_stream* stream, const char* path);
+
+
+// serial-Ressourcen(-Typen)
+extern struct cdi_fs_res_res serial_fs_res;
+extern struct cdi_fs_res_file serial_fs_file;
+extern struct cdi_fs_res_dir serial_fs_dir;
+extern struct cdi_fs_res_link serial_fs_link;
+
+#endif /* _SERIAL_CDI_H_ */
Index: src/modules/cdi/serial/init.c
===================================================================
--- src/modules/cdi/serial/init.c (Revision 0)
+++ src/modules/cdi/serial/init.c (Revision 0)
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "serial_cdi.h"
+#include "serial.h"
+#include "cdi/lists.h"
+#include "cdi/misc.h"
+#include <stdio.h>
+
+int serial_fs_init(struct cdi_fs_filesystem* cdi_fs)
+{
+ struct serial_fs_res* root_res;
+ struct serial_fs_res* com1_res;
+ struct serial_fs_res* com2_res;
+ struct serial_fs_res* com3_res;
+ struct serial_fs_res* com4_res;
+
+ // Das FS initialisieren.
+
+ root_res = malloc(sizeof(*root_res));
+ memset(root_res, 0, sizeof(*root_res));
+ root_res->res.name = strdup("/");
+ root_res->res.res = &serial_fs_res;
+ root_res->res.dir = &serial_fs_dir;
+ root_res->res.loaded = 1;
+ root_res->res.children = cdi_list_create();
+ root_res->baseport = 0;
+
+ com1_res = malloc(sizeof(*root_res));
+ memset(com1_res, 0, sizeof(*root_res));
+ com1_res->res.name = strdup("1");
+ com1_res->res.res = &serial_fs_res;
+ com1_res->res.dir = &serial_fs_dir;
+ com1_res->res.loaded = 1;
+ com1_res->res.children = cdi_list_create();
+ com1_res->baseport = COM1_BASE;
+ com1_res->in_use = 0;
+ com1_res->res.parent = (struct cdi_fs_res*) root_res;
+ cdi_list_push(root_res->res.children, com1_res);
+
+ com2_res = malloc(sizeof(*root_res));
+ memset(com2_res, 0, sizeof(*root_res));
+ com2_res->res.name = strdup("2");
+ com2_res->res.res = &serial_fs_res;
+ com2_res->res.dir = &serial_fs_dir;
+ com2_res->res.loaded = 1;
+ com2_res->res.children = cdi_list_create();
+ com2_res->baseport = COM2_BASE;
+ com2_res->in_use = 0;
+ com2_res->res.parent = (struct cdi_fs_res*) root_res;
+ cdi_list_push(root_res->res.children, com2_res);
+
+ com3_res = malloc(sizeof(*root_res));
+ memset(com3_res, 0, sizeof(*root_res));
+ com3_res->res.name = strdup("3");
+ com3_res->res.res = &serial_fs_res;
+ com3_res->res.dir = &serial_fs_dir;
+ com3_res->res.loaded = 1;
+ com3_res->res.children = cdi_list_create();
+ com3_res->baseport = COM3_BASE;
+ com3_res->in_use = 0;
+ com3_res->res.parent = (struct cdi_fs_res*) root_res;
+ cdi_list_push(root_res->res.children, com3_res);
+
+ com4_res = malloc(sizeof(*root_res));
+ memset(com4_res, 0, sizeof(*root_res));
+ com4_res->res.name = strdup("4");
+ com4_res->res.res = &serial_fs_res;
+ com4_res->res.dir = &serial_fs_dir;
+ com4_res->res.loaded = 1;
+ com4_res->res.children = cdi_list_create();
+ com4_res->baseport = COM4_BASE;
+ com4_res->in_use = 0;
+ com4_res->res.parent = (struct cdi_fs_res*) root_res;
+ cdi_list_push(root_res->res.children, com4_res);
+
+ cdi_fs->root_res = (struct cdi_fs_res*) root_res;
+ return 1;
+}
+
+int serial_fs_destroy(struct cdi_fs_filesystem* fs)
+{
+ return serial_fs_res_destroy((struct serial_fs_res*)fs->root_res);
+}
Index: src/modules/cdi/serial/serial.h
===================================================================
--- src/modules/cdi/serial/serial.h (Revision 0)
+++ src/modules/cdi/serial/serial.h (Revision 0)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _SERIAL_H_
+#define _SERIAL_H_
+
+#include <stdint.h>
+
+// Basisadressen.
+uint16_t COM1_BASE;
+uint16_t COM2_BASE;
+uint16_t COM3_BASE;
+uint16_t COM4_BASE;
+
+// Register-Port-Offsets
+#define REG_TR 0x00 // Bei nicht gesetztem DLAB
+#define REG_IER 0x01 // Bei nicht gesetztem DLAB
+#define REG_IIR 0x02
+#define REG_FCR 0x02
+#define REG_LCR 0x03
+#define REG_MCR 0x04
+#define REG_LSR 0x05
+#define REG_MSR 0x06
+#define REG_SCR 0x07
+
+// Parity-Bits
+typedef enum {
+ PARITY_NONE = 0,
+ PARITY_ODD = 4,
+ PARITY_EVEN = 6,
+ PARITY_MARK = 5,
+ PARITY_SPACE = 7
+} parity_t;
+
+// Funktionen
+int serial_init(uint16_t base, uint32_t baudrate, uint8_t bits, uint8_t parity,
+ uint8_t stopbits);
+void serial_send(uint16_t base, uint8_t data);
+int serial_can_send(uint16_t base);
+uint8_t serial_recv(uint16_t base);
+int serial_can_recv(uint16_t base);
+void serial_free(uint16_t base);
+
+#endif /* _SERIAL_H_ */
Index: src/modules/cdi/serial/main.c
===================================================================
--- src/modules/cdi/serial/main.c (Revision 0)
+++ src/modules/cdi/serial/main.c (Revision 0)
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "cdi/fs.h"
+#include "cdi/misc.h"
+
+#include "serial_cdi.h"
+
+struct serial_driver {
+ struct cdi_fs_driver fs;
+};
+
+static struct serial_driver serial_driver;
+static const char* driver_name = "serial";
+
+static int serial_driver_init(struct serial_driver* driver);
+static void serial_driver_destroy(struct cdi_driver* driver);
+
+#ifdef CDI_STANDALONE
+int main(void)
+#else
+int init_serial(void)
+#endif
+{
+ cdi_init();
+
+ if (serial_driver_init(&serial_driver) != 0) {
+ return -1;
+ }
+ cdi_fs_driver_register((struct cdi_fs_driver*) &serial_driver);
+
+#ifdef CDI_STANDALONE
+ cdi_run_drivers();
+#endif
+
+ return 0;
+}
+
+/**
+ * Initialisiert die Datenstrukturen fuer den serial-Treiber
+ */
+static int serial_driver_init(struct serial_driver* driver)
+{
+ // Konstruktor der Vaterklasse
+ cdi_fs_driver_init((struct cdi_fs_driver*) driver);
+
+ // Namen setzen
+ driver->fs.drv.name = driver_name;
+ driver->fs.fs_init = serial_fs_init;
+ driver->fs.fs_destroy = serial_fs_destroy;
+
+ driver->fs.drv.destroy = serial_driver_destroy;
+ return 0;
+}
+
+/**
+ * Deinitialisiert die Datenstrukturen fuer den serial-Treiber
+ */
+static void serial_driver_destroy(struct cdi_driver* driver)
+{
+ cdi_fs_driver_destroy((struct cdi_fs_driver*) driver);
+}
Index: src/modules/cdi/serial/res.c
===================================================================
--- src/modules/cdi/serial/res.c (Revision 0)
+++ src/modules/cdi/serial/res.c (Revision 0)
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "serial_cdi.h"
+#include "serial.h"
+
+int serial_fs_res_load(struct cdi_fs_stream* stream)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+
+ if (res->res.loaded) {
+ return 0;
+ }
+
+ res->res.loaded = 1;
+ return 1;
+}
+
+int serial_fs_res_unload(struct cdi_fs_stream* stream)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+
+ if (!res->res.loaded) {
+ return 0;
+ }
+
+ res->res.loaded = 0;
+ return 1;
+}
+
+int64_t serial_fs_res_meta_read(struct cdi_fs_stream* stream, cdi_fs_meta_t meta)
+{
+ return 0;
+}
+
+int serial_fs_res_meta_write(struct cdi_fs_stream* stream, cdi_fs_meta_t meta,
+ int64_t value)
+{
+ return 0;
+}
+
+int serial_fs_res_assign_class(struct cdi_fs_stream* stream,
+ cdi_fs_res_class_t class)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+ struct serial_fs_res* parent = (struct serial_fs_res*) res->res.parent;
+
+
+ if (class == CDI_FS_CLASS_FILE)
+ {
+ res->res.file = &serial_fs_file;
+
+ // Namen auseinandernehmen
+ char* trenner = NULL;
+ uint32_t baudrate;
+ parity_t parity = PARITY_NONE;
+ uint8_t bits = 8;
+ uint8_t stopbits = 1;
+
+ trenner = index(res->res.name, ',');
+ if (trenner)
+ {
+ char* baudrate_s = malloc(trenner - res->res.name + 1);
+ if (!baudrate_s)
+ {
+ stream->error = CDI_FS_ERROR_INTERNAL;
+ return 0;
+ }
+ strncpy(baudrate_s, res->res.name, trenner - res->res.name );
+ baudrate_s[(trenner - res->res.name)] = 0;
+ baudrate = atoi(baudrate_s);
+ free(baudrate_s);
+
+ char* buffer = malloc(2);
+ if (!buffer)
+ {
+ stream->error = CDI_FS_ERROR_INTERNAL;
+ return 0;
+ }
+ buffer[1] = 0;
+ buffer[0] = trenner[1];
+ bits = (uint8_t)atoi(buffer);
+ buffer[0] = trenner[3];
+ stopbits = (uint8_t)atoi(buffer);
+ free(buffer);
+
+ // Paritaet feststellen.
+ if (strncmp(trenner+2, "n", 1) == 0)
+ {
+ parity = PARITY_NONE;
+ }
+ else if (strncmp(trenner+2, "o", 1) == 0)
+ {
+ parity = PARITY_ODD;
+ }
+ else if (strncmp(trenner+2, "e", 1) == 0)
+ {
+ parity = PARITY_EVEN;
+ }
+ else if (strncmp(trenner+2, "s", 1) == 0)
+ {
+ parity = PARITY_SPACE;
+ }
+ else if (strncmp(trenner+2, "m", 1) == 0)
+ {
+ parity = PARITY_MARK;
+ }
+ else
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+ }
+ else
+ {
+ baudrate = atoi(res->res.name);
+ }
+
+ printf("[SERIAL] Baudrate: %d, Bits: %d, Parity: %d, Stopbits: %d\n",
+ baudrate, bits, parity, stopbits);
+
+ if (baudrate <= 0 || baudrate > 115200)
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+
+ if (bits < 5 || bits > 8)
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+
+ if (stopbits > 1)
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+
+ if (parent->baseport)
+ {
+ serial_init(parent->baseport,baudrate,bits,parity,stopbits);
+ }
+ return 1;
+ }
+ else
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+}
+
+int serial_fs_res_remove_class(struct cdi_fs_stream* stream,
+ cdi_fs_res_class_t class)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+ struct serial_fs_res* parent = (struct serial_fs_res*) res->res.parent;
+
+
+ if (class == CDI_FS_CLASS_FILE && res->baseport == 0)
+ {
+ res->res.file = NULL;
+ serial_free(parent->baseport);
+ return 1;
+ }
+ else
+ {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+}
+
+int serial_fs_res_rename(struct cdi_fs_stream* stream, const char* name)
+{
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+}
+
+int serial_fs_res_remove(struct cdi_fs_stream* stream)
+{
+ struct serial_fs_res* res = (struct serial_fs_res*) stream->res;
+ struct serial_fs_res* parent = (struct serial_fs_res*) res->res.parent;
+
+
+ if (res->baseport != 0) {
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+ }
+
+ // Link aus der Liste der Vater-Resource entfernen
+ size_t i;
+ struct serial_fs_res* child;
+ for (i=0;(child = cdi_list_get(res->res.parent->children,i));i++) {
+ if (child==res) {
+ cdi_list_remove(res->res.parent->children,i);
+ break;
+ }
+ }
+
+ parent->in_use--;
+
+ serial_fs_res_destroy(res);
+
+ return 1;
+}
+
+int serial_fs_res_destroy(struct serial_fs_res* res)
+{
+ struct serial_fs_res *child;
+ while ((child = cdi_list_pop(res->res.children))) serial_fs_res_destroy(child);
+ cdi_list_destroy(res->res.children);
+ serial_free(res->baseport);
+ free(res);
+ return 1;
+}
Index: src/modules/cdi/serial/resources.c
===================================================================
--- src/modules/cdi/serial/resources.c (Revision 0)
+++ src/modules/cdi/serial/resources.c (Revision 0)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "serial_cdi.h"
+
+struct cdi_fs_res_res serial_fs_res = {
+ .load = serial_fs_res_load,
+ .unload = serial_fs_res_unload,
+
+ .meta_read = serial_fs_res_meta_read,
+ .meta_write = serial_fs_res_meta_write,
+
+ .assign_class = serial_fs_res_assign_class,
+ .remove_class = serial_fs_res_remove_class,
+
+ .rename = serial_fs_res_rename,
+ .remove = serial_fs_res_remove
+};
+
+struct cdi_fs_res_file serial_fs_file = {
+ // Prinzipiell haben wir nur ausfuehrbare Dateien, der Rest wird mit den
+ // Berechtigungen geregelt
+ .executable = 1,
+
+ .read = serial_fs_file_read,
+ .write = serial_fs_file_write,
+ .truncate = serial_fs_file_truncate
+};
+
+struct cdi_fs_res_dir serial_fs_dir = {
+ .list = serial_fs_dir_list,
+ .create_child = serial_fs_dir_create_child
+};
+
+struct cdi_fs_res_link serial_fs_link = {
+ .read_link = serial_fs_link_read,
+ .write_link = serial_fs_link_write
+};
+
Index: src/modules/cdi/serial/link.c
===================================================================
--- src/modules/cdi/serial/link.c (Revision 0)
+++ src/modules/cdi/serial/link.c (Revision 0)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Alexander Siol.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "serial_cdi.h"
+
+const char *serial_fs_link_read(struct cdi_fs_stream *stream)
+{
+ return NULL;
+}
+
+int serial_fs_link_write(struct cdi_fs_stream *stream, const char *path)
+{
+ stream->error = CDI_FS_ERROR_ONS;
+ return 0;
+}