Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Accessing GPIO from a Driver | Communicating with Hardware
Practice
Projects
Quizzes & Challenges
Visat
Challenges
/
C Device Drivers Basics

bookAccessing GPIO from a Driver

The GPIO (General Purpose Input/Output) subsystem in Linux provides a unified interface for device drivers to interact with hardware pins that can be configured as either inputs or outputs. These pins are often used to control LEDs, read button states, or communicate with simple peripherals. The Linux kernel abstracts the hardware details, allowing you to request, configure, and manipulate GPIO pins using standard kernel APIs. This abstraction makes your driver code more portable and easier to maintain, regardless of the underlying hardware specifics.

gpio_request_example.c

gpio_request_example.c

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243
#include <linux/module.h> #include <linux/gpio.h> #include <linux/init.h> #include <linux/kernel.h> #define GPIO_NUM 24 // Example GPIO pin number static int __init gpio_example_init(void) { int ret; // Request the GPIO pin ret = gpio_request(GPIO_NUM, "example_gpio"); if (ret) { pr_err("Failed to request GPIO %d\n", GPIO_NUM); return ret; } // Set GPIO direction to output, initial value low ret = gpio_direction_output(GPIO_NUM, 0); if (ret) { pr_err("Failed to set GPIO direction\n"); gpio_free(GPIO_NUM); return ret; } pr_info("GPIO %d requested and set as output\n", GPIO_NUM); return 0; } static void __exit gpio_example_exit(void) { gpio_set_value(GPIO_NUM, 0); // Set low on exit gpio_free(GPIO_NUM); pr_info("GPIO %d released\n", GPIO_NUM); } module_init(gpio_example_init); module_exit(gpio_example_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("GPIO Request and Configure Example");

Once you have requested and configured a GPIO pin as an output, you can control its value directly from your driver. Toggling a GPIO pin means changing its state from high to low or vice versa. This is typically done using the gpio_set_value() function, which sets the output level of the pin. Referencing the configuration code above, after you have successfully set the direction, you are ready to toggle the pin as needed by your device logic.

gpio_toggle_example.c

gpio_toggle_example.c

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243
// gpio_toggle_example.c #include <linux/module.h> #include <linux/gpio.h> #include <linux/init.h> #include <linux/kernel.h> #define GPIO_NUM 24 static int __init gpio_toggle_init(void) { int ret; ret = gpio_request(GPIO_NUM, "toggle_gpio"); if (ret) return ret; ret = gpio_direction_output(GPIO_NUM, 0); if (ret) { gpio_free(GPIO_NUM); return ret; } // Set GPIO high gpio_set_value(GPIO_NUM, 1); pr_info("GPIO %d set HIGH\n", GPIO_NUM); // Set GPIO low gpio_set_value(GPIO_NUM, 0); pr_info("GPIO %d set LOW\n", GPIO_NUM); return 0; } static void __exit gpio_toggle_exit(void) { gpio_set_value(GPIO_NUM, 0); gpio_free(GPIO_NUM); } module_init(gpio_toggle_init); module_exit(gpio_toggle_exit); MODULE_LICENSE("GPL");
question mark

Which function is used to request control of a GPIO pin in the Linux kernel?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

bookAccessing GPIO from a Driver

Pyyhkäise näyttääksesi valikon

The GPIO (General Purpose Input/Output) subsystem in Linux provides a unified interface for device drivers to interact with hardware pins that can be configured as either inputs or outputs. These pins are often used to control LEDs, read button states, or communicate with simple peripherals. The Linux kernel abstracts the hardware details, allowing you to request, configure, and manipulate GPIO pins using standard kernel APIs. This abstraction makes your driver code more portable and easier to maintain, regardless of the underlying hardware specifics.

gpio_request_example.c

gpio_request_example.c

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243
#include <linux/module.h> #include <linux/gpio.h> #include <linux/init.h> #include <linux/kernel.h> #define GPIO_NUM 24 // Example GPIO pin number static int __init gpio_example_init(void) { int ret; // Request the GPIO pin ret = gpio_request(GPIO_NUM, "example_gpio"); if (ret) { pr_err("Failed to request GPIO %d\n", GPIO_NUM); return ret; } // Set GPIO direction to output, initial value low ret = gpio_direction_output(GPIO_NUM, 0); if (ret) { pr_err("Failed to set GPIO direction\n"); gpio_free(GPIO_NUM); return ret; } pr_info("GPIO %d requested and set as output\n", GPIO_NUM); return 0; } static void __exit gpio_example_exit(void) { gpio_set_value(GPIO_NUM, 0); // Set low on exit gpio_free(GPIO_NUM); pr_info("GPIO %d released\n", GPIO_NUM); } module_init(gpio_example_init); module_exit(gpio_example_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("GPIO Request and Configure Example");

Once you have requested and configured a GPIO pin as an output, you can control its value directly from your driver. Toggling a GPIO pin means changing its state from high to low or vice versa. This is typically done using the gpio_set_value() function, which sets the output level of the pin. Referencing the configuration code above, after you have successfully set the direction, you are ready to toggle the pin as needed by your device logic.

gpio_toggle_example.c

gpio_toggle_example.c

copy
12345678910111213141516171819202122232425262728293031323334353637383940414243
// gpio_toggle_example.c #include <linux/module.h> #include <linux/gpio.h> #include <linux/init.h> #include <linux/kernel.h> #define GPIO_NUM 24 static int __init gpio_toggle_init(void) { int ret; ret = gpio_request(GPIO_NUM, "toggle_gpio"); if (ret) return ret; ret = gpio_direction_output(GPIO_NUM, 0); if (ret) { gpio_free(GPIO_NUM); return ret; } // Set GPIO high gpio_set_value(GPIO_NUM, 1); pr_info("GPIO %d set HIGH\n", GPIO_NUM); // Set GPIO low gpio_set_value(GPIO_NUM, 0); pr_info("GPIO %d set LOW\n", GPIO_NUM); return 0; } static void __exit gpio_toggle_exit(void) { gpio_set_value(GPIO_NUM, 0); gpio_free(GPIO_NUM); } module_init(gpio_toggle_init); module_exit(gpio_toggle_exit); MODULE_LICENSE("GPL");
question mark

Which function is used to request control of a GPIO pin in the Linux kernel?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 4
some-alt