作 者:道哥,10 年嵌入式開發(fā)老兵,專注于:C/C 、嵌入式、Linux。
關注下方公眾號,回復【書籍】,獲取 Linux、嵌入式領域經典書籍;回復【PDF】,獲取所有原創(chuàng)文章( PDF 格式)。
目錄
別人的經驗,我們的階梯!
大家好,我是道哥。
在前幾篇文章中,我們一塊討論了:在Linux系統(tǒng)中,編寫
字符設備驅動程序的基本框架,主要是從
代碼流程和 API 函數(shù)這兩方面觸發(fā)。
這篇文章,我們就以此為基礎,寫一個有
實際應用功能的驅動程序:
-
在驅動程序中,初始化 GPIO 設備,自動創(chuàng)建設備節(jié)點;
-
在應用程序中,打開 GPIO 設備,并發(fā)送控制指令設置 GPIO 口的狀態(tài);
示例程序目標
編寫一個驅動程序模塊:
mygpio.ko。
當這個驅動模塊被加載的時候,在系統(tǒng)中創(chuàng)建一個mygpio類設備,并且在/dev目錄下,創(chuàng)建4個設備節(jié)點:
/dev/mygpio0
/dev/mygpio1
/dev/mygpio2
/dev/mygpio3
因為我們現(xiàn)在是在x86平臺上來
模擬 GPIO的控制操作,
并沒有實際的GPIO硬件設備。
因此,在驅動代碼中,與硬件相關部分的代碼,使用宏MYGPIO_HW_ENABLE控制起來,并且在其中使用printk輸出打印信息來體現(xiàn)硬件的操作。
在應用程序中,可以分別打開以上這4個GPIO設備,并且通過發(fā)送
控制指令,來設置GPIO的狀態(tài)。
以下所有操作的工作目錄,都是與上一篇文章相同的,即:~/tmp/linux-4.15/drivers/。
創(chuàng)建驅動目錄和驅動程序
$ cd linux-4.15/drivers/
$ mkdir mygpio_driver
$ cd mygpio_driver
$ touch mygpio.c
mygpio.c文件的內容如下(
不需要手敲,文末有代碼下載鏈接):
#include
#include
#include
#include
#include
// GPIO 硬件相關宏定義
#define MYGPIO_HW_ENABLE
// 設備名稱
#define MYGPIO_NAME "mygpio"
// 一共有4個 GPIO 口
#define MYGPIO_NUMBER 4
// 設備類
static struct class *gpio_class;
// 用來保存設備
struct cdev gpio_cdev[MYGPIO_NUMBER];
// 用來保存設備號
int gpio_major = 0;
int gpio_minor = 0;
#ifdef MYGPIO_HW_ENABLE
// 硬件初始化函數(shù),在驅動程序被加載的時候(gpio_driver_init)被調用
static void gpio_hw_init(int gpio)
{
printk("gpio_hw_init is called: %d. \n", gpio);
}
// 硬件釋放
static void gpio_hw_release(int gpio)
{
printk("gpio_hw_release is called: %d. \n", gpio);
}
// 設置硬件GPIO的狀態(tài),在控制GPIO的時候(gpio_ioctl)被調研
static void gpio_hw_set(unsigned long gpio_no, unsigned int val)
{
printk("gpio_hw_set is called. gpio_no = %ld, val = %d. \n", gpio_no, val);
}
#endif
// 當應用程序打開設備的時候被調用
static int gpio_open(struct inode *inode, struct file *file)
{
printk("gpio_open is called. \n");
return 0;
}
// 當應用程序控制GPIO的時候被調用
static long gpio_ioctl(struct file* file, unsigned int val, unsigned long gpio_no)
{
printk("gpio_ioctl is called. \n");
// 檢查設置的狀態(tài)值是否合法
if (0 != val
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。