I3MPS_Opgave5

I denne opgave, skal vi udfylde de manglende elementer i en driver, samt lave denne generisk, så den kan bruges generelt på GPIO 130 - 137.

I denne opgave, har vi gjort brug af gpio structen, som indeholdte information om de enkelte porte. code format="c" struct gpioPort{ unsigned int num; enum direnu { in, out } dir; const char label[10]; // Very important to specify a size. Just [] causes havoc to gpio indexing } gpio[] = { {130, in, "gpio0_0"}, {131, in, "gpio0_1"}, {132, in, "gpio0_2"}, {133, in, "gpio0_3"}, {134, out, "gpio0_4"}, {135, out, "gpio0_5"}, {136, out, "gpio0_6"}, {137, out, "gpio0_7"} }; code Nedenfor viser vi hvad vi har tilføjet / ændret i de enkelte funktioner

code format="c" static int mygpio_init(void) {   ...    /*    * Request GPIO Ressources */
 * mygpio_init & mygpio_exit

int i = 0;

for(i = 0; i < 8; i++) gpio_request(gpio[i].num, gpio[i].label);

/*   * Set GPIO Direction */

for(i = 0; i < 8; i++) {       if(gpio[i].dir == in) gpio_direction_input(gpio[i].num); else gpio_direction_output(gpio[i].num, true); }

return 0; }

static void mygpio_exit(void) {   ...     /*     * Free GPIO Ressources */

int i = 0; for(i = 0; i < 8; i++) gpio_free(gpio[i].num); ... } code code format="c" ssize_t mygpio_write(struct file *filep, const char __user *ubuf,                 size_t count, loff_t *f_pos) {   ...    /*     * Use gpio_set_value on appropriate port * (if an output port) */
 * mygpio_write & mygpio_read

if(gpio[minor].dir == out) gpio_set_value(gpio[minor].num, value); else printk(KERN_ALERT "Unable to write to input\n"); ... }

ssize_t mygpio_read(struct file *filep, char __user *buf,                size_t count, loff_t *f_pos) {   ...    /*    * Read GPIO port * (if an input port) */

if(gpio[minor].dir == in) result = gpio_get_value(gpio[minor].num); else printk(KERN_ALERT "Unable to read Output\n"); ... } code Link til fuld source kode Efter modulen blev kompileret, blev det indsat i kernen. Herefter oprettede vi nodefiler med følgende kommandoer: code mknod /dev/mygpio0 c 62 0 ... mknod /dev/mygpio7 c 62 7 code Derefter havde vi mulighed for at aflæse status på input (0 eller 1), og få en lysdiode til at tænde og slukke, ved at skrive til den pågældende node på output.