6410之驅動程式的分層分離,匯流排裝置驅動模型

2021-06-18 00:16:10 字數 3037 閱讀 9341

什麼是分離分層的概念?

如前面的input子系統所述,分離分層概念可以如下圖所示:

input.c和buttons.c,evdev.c形成分層的概念,buttons.c和evdev.c形成分離的概念,一邊是硬體相關的**由編寫驅動的人員編寫,一邊是純軟體是由linux核心所提供的。

匯流排驅動裝置模型:

該模型有三個結構體:

struct bus_type,struct device和struct device_driver。詳細的裝置模型內容可以參考

如上圖所示:

device_add的作用:

1.把device放入bus的dev鍊錶中

2.從bus的drv鍊錶中取出每乙個drv,再使用bus上的match函式判斷drv是否支援dev

3.若可以支援,則呼叫drv的probe函式

driver_register的作用:

1.將driver放入到bus的drv鍊錶中。

2.從bus上的devices鍊錶中取出每乙個dev,再使用bus上的match函式判斷drv是否支援dev

3.若可以支援,則呼叫drv的probe函式

當乙個資料夾中有多個模組檔案,就需要將makefile修改:

obj-m += led_dev.o

obj-m += led_drv.o

led_dev.c

#include #include #include #include #include static struct resource s3c_led_resource = ,

[1] =

};void led_release(struct device *dev)

struct platform_device led_dev =

};static int led_devices_init(void)

static void led_devices_exit(void)

module_init(led_devices_init);

module_exit(led_devices_exit);

module_license("gpl");

如果不加release函式的話,在rmmod led_dev的時候出現下面現象:

具體操作led:

只需要修改led_drv.c即可:

#include #include #include #include #include #include #include #include struct class *led_dev_class;

struct device *led_dev;

int major;

static int pin;

static volatile unsigned long *gpiocon;

static volatile unsigned long *gpiodat;

static int led_drv_open(struct inode *inode, struct file *file)

ssize_t led_drv_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)

else if(val == 0)

return sizeof(buf);

}static struct file_operations led_drv_fops = ;

static int led_probe(struct platform_device *pdev)

static int led_remove(struct platform_device *dev)

struct platform_driver led_driver = ,

};static int led_driver_init(void)

static void led_driver_exit(void)

module_init(led_driver_init);

module_exit(led_driver_exit);

module_license("gpl");

測試程式:

#include #include int main(int argc , char **argv)

if(!strcmp(argv[1],"on"))else if(!strcmp(argv[1],"off"))

fd = open("/dev/led",o_rdwr); //開啟裝置節點/dev/led

if(fd < 0)

write(fd,&val,4);//向裝置節點做寫操作

return 0;

}

驅動程式分層 分隔思想

前面我們學習i2c usb sd驅動時,有沒有發現乙個共性,就是在驅動開發時,每個驅動都分層三部分,由上到下分別是 1 裝置驅動 2 核心層 3 主機控制器驅動 而需要我們編寫的主要是裝置驅動部分,主機控制器驅動部分也有少量編寫,二者進行互動主要時由核心層提供的介面來實現 這樣結構清晰,大大地有利於...

基於Tiny6410的LED驅動程式

從電路圖中看出,gpio低電平有效 led亮 gpk共有16個埠,每個埠由三個暫存器控制 控制暫存器 gpkcon 資料暫存器 gpkdat 和上拉暫存器 gpkpud 每個暫存器都是32位,如下圖所示。gpk的控制暫存器分為兩個,gpkcon0控制0 8好埠,gpkcon1控制9 15號埠。控制暫...

tiny6410 驅動程式 定時器

drv timer.c driver timer test include include include include static struct timer list my timer static void timer func unsigned long data my timer.exp...