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
voidseven_gpio_init(void){
voidseven_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
voidseven_gpio_exit(void){
voidseven_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
voidseven_status(intdisplay){
voidseven_status(intdisplay){//Switch-case fuer die Anzeigemoeglichkeiten auf der 7 Segment-Anzeige
switch(display){
case0:
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;
case1:
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;
case2:
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;
case3:
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;
case4:
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;
case5:
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;
case6:
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;
case7:
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;
case8:
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;
case9:
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
intseven_dev_init(void)
intseven_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);
returnMajor;
}
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