Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Themen - jgraef

Seiten: [1]
1
Lowlevel-Coding / Escape-Scancode an falscher Stelle
« am: 08. November 2008, 22:02 »
Hi,

Ich bin gerade dabei einen Tastatur-Treiber zu schreiben. Funktioniert auch alles super, bis auf Tasten, die escaped werden. Irgendwie bekomme ich erst den normalen Scancode und dann den Escape-Code. Dadurch denkt mein Treiber natürlich dass die normale Taste gedrückt wurde.

Wenn ich '/' auf dem Numpad drücke bekomme ich folgende Scancodes:
Zitat
Scancode: 0x35
Scancode: 0xe0
Scancode: 0xb5
Scancode: 0xe0
Wird dann natürlich als '-' erkannt, wegen dem 0x35.
2
tyndur / CDI - Generic
« am: 01. August 2008, 23:25 »
Hi,

So, das ist der erste Entwurf, für den CDI-Teil (oder -Modul, wie man es nennen will) für allgemeine Treiber. Wie z.B Tastatur, Maus, Lautsprecher, usw. Jedes Device hat einen Datenstream und mehrere Steuerfunktionen. Der Datenstream überträgt z.B die Keycodes einer Tastatur. Mit den Steuerfunktionen kann man z.B NumLock usw. steuern, oder dem Gerät ein anderes Tastaturlayout zuordnen.

PS: Wie ich im IRC schon angemerkt hatte, hätte ich nichts gegen eine Kooperation beim Schreiben eines CDI-Tastatur-Treibers.

EDIT: Jeder Stream-Typ bekommt eine eigene Struktur. Als Beispiel habe ich die eines Joystick-Streams angelegt. Ob man für Character-Streams ein Struct braucht ist fraglich.

#ifndef _CDI_GENERIC_H_
#define _CDI_GENERIC_H_

#include <sys/types.h>

#include "cdi.h"
#include "cdi/lists.h"

/// Struktur fuer Stream-Objekt fuer Joystick
struct cdi_generic_stream_joystick {
  int axis_raw[2];
  int axis_cal[2];
  int buttons[2];
};

/**
 * Struktur fuer CDI Generic Driver
 */
struct cdi_generic_driver {
  /// Allgemeine CDI-Treiber-Struktur
  struct cdi_driver drv;
};

struct cdi_generic_stream;

/**
 * Struktur fuer CDI Generic Devices
 */
struct cdi_generic_device {
  /// Allgemeine CDI-Geraete-Struktur
  struct cdi_device dev;

  /// Datenstream des Geraets
  struct cdi_generic_stream *stream;

  /// Steuerfunktionen des Geraets
  cdi_list_t functions;
};

/**
 * Struktur eines Streams
 * Wie die Daten des Streams verarbeitet werden haengt vom Treiber ab.
 * Gebraeuchlich ist die Arbeitsweise FIFO
 *  - read() wird von der Implementation aufgerufen, wenn ein Programm Daten
 *    vom Stream lesen will.
 *  - write() wird von der Implementation aufgerufen, wenn ein Programm Daten
 *    in den Stream schreiben will.
 */
struct cdi_generic_stream {
  /// Groesse eines Objekts
  size_t objsz;
  /// Liest ein Objekt vom Stream
  int (*read)(struct cdi_generic_device *dev,void *obj,size_t count);
  /// Schreibt ein Objekt in den Stream
  int (*write)(struct cdi_generic_device *dev,void *obj,size_t count);
};

/**
 * Struktur einer Steuerfunktion
 * Steuerfunktionen werden vom Treiber zur Verfuegung gestellt um erweiterten
 * Zugriff auf das Geraet zu haben. Jede Funktion hat ein Objekt, dass der
 * Funktion vom Aufrufer uebergeben wird und ein Objekt, dass die Funktion
 * an den Aufrufer zurueck gibt.
 */
struct cdi_generic_function {
  /**
   * Referenz zur Steuerfunktion
   *  @param dev CDI-Geraet
   *  @param data Datenobjekt
   *  @param datasz Groesse von data
   *  @param ret Rueckgabeobjekt
   *  @param retsz Groesse von data
   *  @return Rueckgabewert
   */
  int (*func)(struct cdi_generic_device *dev,void *data,size_t datasz,void *ret,size_t retsz);

  // meinOS specific
  /// Nummer der Funktion
  int cmd;
};

/**
 * Initialisiert einen CDI-Generic-Treiber
 *  @param driver CDI-Generic-Treiber
 */
void cdi_generic_driver_init(struct cdi_generic_driver* driver);

/**
 * Zerstoert einen CDI-Generic-Treiber
 *  @param driver CDI-Generic-Treiber
 */
void cdi_generic_driver_destroy(struct cdi_generic_driver* driver);

/**
 * Registriert einen CDI-Generic-Treiber
 *  @param driver CDI-Generic-Treiber
 */
void cdi_generic_driver_register(struct cdi_generic_driver* driver);

#endif
3
Lowlevel-Coding / ld findet _start nicht
« am: 03. June 2008, 16:12 »
Hi,

Um Programme für meinOS zu linken benutze ich folgenden Befehl:
$ ld -o init init.o -T../link.ld -L../lib -lc -lmeinos -lgccDabei bekomme ich folgende Fehlermeldung:
Zitat
ld: warning: cannot find entry symbol _start; defaulting to 0000000000002000

Mein Problem ist nun, dass ich nicht weiß warum er _start nicht findet obwohl ich die entsprechende Datei dazulinke (ist in libc enthalten). Hier der Beweis:
$ nm libc.a | grep _start
00000000 T _start
4
tyndur / cdi.fs
« am: 11. February 2008, 16:20 »
Viele kennen es schon, für die Restlichen: cdi.fs ist als Interface für Dateisystem-Treiber gedacht.
BTW: Ich habe in letzter Zeit etwas mit fuse gearbeitet. Man könnte sich ja etwas davon inspirieren lassen.

Die 1. drei Funktions-Deklarationen sollten klar sein. cdi_fs_seterror() ermöglicht dem FS-Treiber einen error zu setzen (siehe ferror). Aber eigentlich müsste man das anderst machen, da man ja für jeden Filehandle ferror() machen kann.
cdi_fs_read_data() und cdi_fs_write_data() sind da um dem FS-Treiber Zugriff auf das Speichermedium zu geben.

#ifndef _CDI_FS_H_
#define _CDI_FS_H_

#include "types.h"
#include "cdi.h"
#include "cdi/lists.h"

#define CDI_FS_META_NONE       0 /* -/- Invalid Meta read        */
#define CDI_FS_META_MODE       1 /* r/w Get/Set permissions      */
#define CDI_FS_META_OWNER      2 /* r/w Get/Set owner            */
#define CDI_FS_META_GROUP      3 /* r/w Get/Set owner group      */
#define CDI_FS_META_TYPE       4 /* r/- Get file type            */
#define CDI_FS_META_SIZE       5 /* r/- Get file size            */
#define CDI_FS_META_USEDBLOCKS 6 /* r/- Get how many blocks used */
#define CDI_FS_META_CREATETIME 7 /* r/- Get creation time        */
#define CDI_FS_META_ACCESSTIME 8 /* r/- Get time of last access  */
#define CDI_FS_META_CHANGETIME 9 /* r/- Get time if last change  */

#define CDI_FS_ERROR_NONE    0 /* No Error */
#define CDI_FS_ERROR_ONS     1 /* Operation not supported */
#define CDI_FS_ERROR_FNF     2 /* File not found */
#define CDI_FS_ERROR_EOF     3 /* End of file */
#define CDI_FS_ERROR_UNKNOWN 4 /* Unknown error */

typedef enum {
  CDI_FS_TYPE_NONE     = 0, // Invalid file type
  CDI_FS_TYPE_FILE     = 1, // normal file
  CDI_FS_TYPE_DIR      = 2, // Directory
  CDI_FS_TYPE_FIF0     = 3, // First-In-First-Out-Pipe
  CDI_FS_TYPE_LIFO     = 4, // Last-In-First-Out-Pipe (Stack)
  CDI_FS_TYPE_BLOCKDEV = 5, // Block device
  CDI_FS_TYPE_CHARDEV  = 6, // Character device
  CDI_FS_TYPE_SYMLINK  = 7, // Symbolic link, points to another file
  CDI_FS_TYPE_SOCKET   = 8, // Unix socket
  CDI_FS_TYPE_BUFFER   = 9 // Buffer (like file but stored in RAM and will get deleted when closed)
} cdi_filetype_t;

struct cdi_fs_driver {
  struct cdi_driver drv;
  /**
   * Opens a file/pipe/etc and returns file descriptor
   *  @param path Path to file
   *  @return File descriptor (negative = Failure)
   */
  int (*open)(const char *path);
  /**
   * Closes a file
   *  @param fildes File descriptor
   *  @return 0 = Success
   */
  int (*close)(int fildes);
  /**
   * Creates an file/dir/pipe/etc
   *  @param path Path to file
   *  @param type Whether it is a file/dir/etc
   *  @param mode Permissions
   *  @return 0 = Success
   */
  int (*create)(const char *path,int type,mode_t mode);
  /**
   * Removes a file/dir/pipe/etc
   *  @param path Path to dir
   *  @return 0 = Success
   */
  int (*remove)(const char *path);
  /**
   * Puts filenames of files from dir in list
   *  @param path Path to dir
   *  @param content List with filenames
   *  @return 0 = Success
   */
  int (*listdir)(const char *path,cdi_list_t content);
  /**
   * Sets meta data of a file/dir/pipe/etc
   *  @param path Path to file/dir/pipe/etc
   *  @param which Which meta information to set
   *  @param value Value to set as meta
   *  @return 0 = Success
   */
  void (*setmeta)(const char *path,int which,int value);
  /**
   * Gets meta data of a file/dir/pipe/etc
   *  @param path Path to file/dir/pipe/etc
   *  @param which Which meta information to get
   *  @return Meta data
   */
  int (*getmeta)(const char *path,int which);
  /**
   * Reads from an opened file
   *  @param fildes File descriptor of opened file
   *  @return Byte readed
   */
  u8 (*read)(int fildes);
  /**
   * Writes to an opened file
   *  @param fildes File descriptor of opened file
   *  @param byte Byte to write
   */
  void (*write)(int fildes,u8 byte);
  char *device; ///< @note meinOS specific
};

void cdi_fs_driver_init(struct cdi_fs_driver* driver);
void cdi_fs_driver_destroy(struct cdi_fs_driver* driver);
void cdi_fs_driver_register(struct cdi_fs_driver* driver);
void cdi_fs_seterror(struct cdi_fs_driver* driver,int error);
void cdi_fs_read_data(struct cdi_fs_driver* driver,void *buffer,size_t count);
void cdi_fs_write_data(struct cdi_fs_driver* driver,void *buffer,size_t count);

#endif
Seiten: [1]

Einloggen