Commit ae428915 authored by Christian Eckl's avatar Christian Eckl
Browse files

Update Dokumentation.md

parent 63bd0e35
......@@ -107,18 +107,18 @@ Damit alle Funktionen der im Code verwendeten Funktionen funktionieren müssen e
- linux/kernel.h : Headerfile für die KERN_INFO Ausgabe
```
#define A1 17 // Pin 17 wird durch A1 ersetzt (7SEG a)
#define A2 27 // Pin 27 wird durch A2 ersetzt (7SEG b)
#define A3 22 // Pin 12 wird durch A3 ersetzt (7SEG c)
#define A4 5 // Pin 5 wird durch A4 ersetzt (7SEG d)
#define A5 6 // Pin 6 wird durch A5 ersetzt (7SEG e)
#define A6 13 // Pin 13 wird durch A6 ersetzt (7SEG f)
#define A7 19 // Pin 19 wird durch A7 ersetzt (7SEG g)
#define A8 26 // Pin 26 wird durch A8 ersetzt (7SEG dot)
#define Sa 17 // Pin 17 wird durch Sa ersetzt (7SEG a)
#define Sb 27 // Pin 27 wird durch Sb ersetzt (7SEG b)
#define Sc 22 // Pin 12 wird durch Sc ersetzt (7SEG c)
#define Sd 5 // Pin 5 wird durch Sd ersetzt (7SEG d)
#define Se 6 // Pin 6 wird durch Se ersetzt (7SEG e)
#define Sf 13 // Pin 13 wird durch Sf ersetzt (7SEG f)
#define Sg 19 // Pin 19 wird durch Sg ersetzt (7SEG g)
#define Sp 26 // Pin 26 wird durch Sp ersetzt (7SEG dot)
#define SUCCESS 0
#define DEVICE_NAME "sevenseg" // Device-Name
#define BUF_LEN 1 /* Maximale Länge der Nachricht vom Treiber */
#define BUF_LEN 1 // Maximale Länge einer Nachricht
```
### 2.2.2 Lizensierung und Modul Dokumentation
......@@ -152,25 +152,25 @@ vermagic: 4.9.62-v7+ SMP mod_unload modversions ARMv7 p2v8
Um die 7-Segemntanzeige an einem Raspberry Pi zu betreiben müssen die GPIO-Pins (engl. GPIO – general purpose input/output) über den Treiber angesprochen und verwaltet werden die sgeschieht im folgenden Abschnitt.
Als erstes müssen die Pins initialisiert werden:
```c
void seven_gpio_init(void) {
void seven_gpio_init(void) { //Initialisiert die GPIO-Pins (gpio_request)
printk(KERN_INFO "SEVENSEG: starting gpio...");
gpio_request(A1, "A1");
gpio_request(A2, "A2");
gpio_request(A3, "A3");
gpio_request(A4, "A4");
gpio_request(A5, "A5");
gpio_request(A6, "A6");
gpio_request(A7, "A7");
gpio_request(A8, "A8");
gpio_direction_output(A1, 0);
gpio_direction_output(A2, 0);
gpio_direction_output(A3, 0);
gpio_direction_output(A4, 0);
gpio_direction_output(A5, 0);
gpio_direction_output(A6, 0);
gpio_direction_output(A7, 0);
gpio_direction_output(A8, 0);
gpio_request(Sa, "Sa");
gpio_request(Sb, "Sb");
gpio_request(Sc, "Sc");
gpio_request(Sd, "Sd");
gpio_request(Se, "Se");
gpio_request(Sf, "Sf");
gpio_request(Sg, "Sg");
gpio_request(Sp, "Sp");
gpio_direction_output(Sa, 0); //Legt fest das der Pin als Output-Pin ansprechbar ist (gpio_direction_output)
gpio_direction_output(Sb, 0);
gpio_direction_output(Sc, 0);
gpio_direction_output(Sd, 0);
gpio_direction_output(Se, 0);
gpio_direction_output(Sf, 0);
gpio_direction_output(Sg, 0);
gpio_direction_output(Sp, 0);
printk(KERN_INFO "SEVENSEG: starting gpio done.");
}
```
......@@ -179,139 +179,206 @@ Um mit den Pins arbeiten zu können muss noch festgelegt werden, dass es Output-
Wenn man das Modul entladen will müssen die GPIO-Pins wieder freigegeben werden was im folgenden Codeabschnitt durch `gpio_free(const int gpio)` realisiert wurde:
```c
void seven_gpio_exit(void) {
void seven_gpio_exit(void) { //Beim Rausladen des LKM werden die Pins wieder freigegeben (gpio_free)
printk(KERN_INFO "SEVENSEG: stopping gpio...");
gpio_free(A1);
gpio_free(A2);
gpio_free(A3);
gpio_free(A4);
gpio_free(A5);
gpio_free(A6);
gpio_free(A7);
gpio_free(A8);
gpio_free(Sa);
gpio_free(Sb);
gpio_free(Sc);
gpio_free(Sd);
gpio_free(Se);
gpio_free(Sf);
gpio_free(Sg);
gpio_free(Sp);
printk(KERN_INFO "SEVENSEG: stopping gpio done.");
}
```
Um Zeichen auf der 7-Segment Anzeige ausgeben zu können müssen für jedes Zeichen verschiedene Pins angesprochen und auf `HIGH = 1` oder `LOW = 0` gesetzt werden:
```c
void seven_status(int display) {
void seven_status(int display) { //Switch-case fuer die Anzeigemoeglichkeiten auf der 7 Segment-Anzeige
switch (display) {
case 0 :
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 0 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt 0 an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 1);
gpio_set_value(Sp, 1);
break;
case 1:
gpio_set_value(A1, 1);
gpio_set_value(A2, 1);
gpio_set_value(A3, 1);
gpio_set_value(A4, 1);
gpio_set_value(A5, 1); // 7-Segment zeigt 1 an
gpio_set_value(A6, 1);
gpio_set_value(A7, 1);
gpio_set_value(A8, 1);
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 1);
gpio_set_value(Se, 1); // 7-Segment zeigt 1 an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 1);
gpio_set_value(Sp, 1);
break;
case 2:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 2 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 1);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt 2 an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 3:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 3 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 1); // 7-Segment zeigt 3 an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 4:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 4 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 1);
gpio_set_value(Se, 1); // 7-Segment zeigt 4 an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 5:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 5 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 1); // 7-Segment zeigt 5 an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 6:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 6 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt 6 an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 0);
break;
case 7:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 7 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 1);
gpio_set_value(Se, 1); // 7-Segment zeigt 7 an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 1);
gpio_set_value(Sp, 1);
break;
case 8:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 8 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt 8 an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 9:
gpio_set_value(A1, 0);
gpio_set_value(A2, 0);
gpio_set_value(A3, 0);
gpio_set_value(A4, 0);
gpio_set_value(A5, 0); // 7-Segment zeigt 9 an
gpio_set_value(A6, 0);
gpio_set_value(A7, 0);
gpio_set_value(A8, 0);
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 1); // 7-Segment zeigt 9 an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 'a':
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt a an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 'b':
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt b an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 'c':
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 1);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt c an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 'd':
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 0);
gpio_set_value(Sc, 0);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt d an
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 'e':
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 1);
gpio_set_value(Sd, 0);
gpio_set_value(Se, 0); // 7-Segment zeigt e an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
case 'f':
gpio_set_value(Sa, 0);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 1);
gpio_set_value(Sd, 1);
gpio_set_value(Se, 0); // 7-Segment zeigt f an
gpio_set_value(Sf, 0);
gpio_set_value(Sg, 0);
gpio_set_value(Sp, 1);
break;
default:
gpio_set_value(A1, 1);
gpio_set_value(A2, 1);
gpio_set_value(A3, 1);
gpio_set_value(A4, 1);
gpio_set_value(A5, 1); //default alle Pins auf LOW gesetzt
gpio_set_value(A6, 1);
gpio_set_value(A7, 1);
gpio_set_value(A8, 1);
gpio_set_value(Sa, 1);
gpio_set_value(Sb, 1);
gpio_set_value(Sc, 1);
gpio_set_value(Sd, 1);
gpio_set_value(Se, 1); //default alle Pins auf LOW gesetzt
gpio_set_value(Sf, 1);
gpio_set_value(Sg, 1);
gpio_set_value(Sp, 1);
break;
}
}
```
Nachdem die Funktion mit der gewünschten Ausgabe `seven_status(int display)` aufgerufen wurde, werden in der switch-case-Funktion die GPIO-Pins angesprochen
......@@ -345,18 +412,18 @@ Man kann seine eigene Major Nummer bestimmen muss aber darauf achten das sie noc
`register_chrdev(unsigned int major, const char *name, struct file_operations *fops)` bei `unsigned int major` 0 ein und lässt sich dann durch die Rückgabe eine freie Major Nummer zuteilen
wie im folgenden Code-Abschnitt:
```c
int seven_dev_init(void)
int seven_dev_init(void) //Wird aufgerufen wenn das Modul geladen wird
{
Major = register_chrdev(0, DEVICE_NAME, &seven_fops);
Major = register_chrdev(0, DEVICE_NAME, &seven_fops); //Registrierung eines Chardevice
if (Major < 0) {
printk(KERN_ALERT "SEVENSEG: Registering char device failed with %d\n", Major);
return Major;
}
printk(KERN_INFO "SEVENSEG: sevenseg driver loaded with major %d\n", Major);
printk(KERN_INFO "SEVENSEG: >> $ mknod /dev/%s c %d 0\n", DEVICE_NAME, Major); //Info welche Nodedatei mit welchen Parametern erstellt werden soll
printk(KERN_INFO "SEVENSEG: >> $ mknod /dev/%s c %d 0\n", DEVICE_NAME, Major); //Info welche Nodedatei mit welchen parametern erstellt werden soll
msg = (char *)kmalloc(32, GFP_KERNEL); //Speicherreservierung fuer die Uebertragung von User-Space zu Kernel-Space
msg = (char *)kmalloc(32, GFP_KERNEL); //Speicherreservierung fuer die Uebertragung von Kernelspace zu Userspace
if (msg != NULL)
printk("malloc allocator address: 0x%p\n", msg);
return SUCCESS;
......@@ -405,9 +472,30 @@ static ssize_t seven_write(struct file *filep, const char *buffer, size_t len, l
else if (msg[0] == '8') {
seven_status(8);
}
else if (msg[0] == '9') {
seven_status(9);
}
else if (msg[0] == 'a') {
seven_status('a');
}
else if (msg[0] == 'b') {
seven_status('b');
}
else if (msg[0] == 'c') {
seven_status('c');
}
else if (msg[0] == 'd') {
seven_status('d');
}
else if (msg[0] == 'e') {
seven_status('e');
}
else if (msg[0] == 'f') {
seven_status('f');
}
else
{
seven_status(0);
seven_status('default');
}
return len;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment