自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HDF驅(qū)動框架探路(一):工欲善其事,必先利其器(linux驅(qū)動開發(fā))

系統(tǒng) Linux
正如標(biāo)題所示工欲善其事,必先利其器。這個器就是首先得知道linux驅(qū)動開發(fā)。那么本文就是講解linux驅(qū)動開發(fā)的。

[[436207]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

老規(guī)矩還是將最終希望跑出來的效果如下:

HDF驅(qū)動框架探路(一):工欲善其事,必先利其器(linux驅(qū)動開發(fā))-鴻蒙HarmonyOS技術(shù)社區(qū)

前言

從本文開始會為記錄一個驅(qū)動小白的成長道路。當(dāng)你已經(jīng)具備了成熟的驅(qū)動開發(fā)經(jīng)驗的話,那么你可以直接跳過,本文對你毫無用處。作為一個沒有接觸過任何驅(qū)動開發(fā)的小白來說,想要搞清楚openharmony的HDF驅(qū)動框架的話,我大概梳理了一下,不對之處各位大佬留言指出。想要徹底搞清楚HDF框架我認(rèn)為第一步必須需要搞清楚linux驅(qū)動,因為linux內(nèi)核是被廣泛使用的,無論android,ios,還是openharmony。因為linux內(nèi)核最基礎(chǔ)的用戶態(tài)和內(nèi)核態(tài)的概念最存在于各種驅(qū)動開發(fā)中的。

所以有了上述的認(rèn)識,正如標(biāo)題所示工欲善其事,必先利其器。這個器就是首先得知道linux驅(qū)動開發(fā)。那么本文就是講解linux驅(qū)動開發(fā)的。

雖然本文是來介紹linux驅(qū)動開發(fā)的,不過我們還是先來了解一下HDF的概念,只需要知道這個概念,應(yīng)為我們現(xiàn)在的工作都是為這個概念服務(wù)的。那么:什么是HDF驅(qū)動框架?HDF(Hardware Driver Foundation)驅(qū)動框架,為驅(qū)動開發(fā)者提供驅(qū)動框架能力,包括驅(qū)動加載、驅(qū)動服務(wù)管理和驅(qū)動消息機制。旨在構(gòu)建統(tǒng)一的驅(qū)動架構(gòu)平臺,為驅(qū)動開發(fā)者提供更精準(zhǔn)、更高效的開發(fā)環(huán)境,力求做到一次開發(fā),多系統(tǒng)部署。

什么是驅(qū)動開發(fā)?

這個看似不是問題的問題卻很重要,我們必須需要從這一步開始理清楚,見下圖:

HDF驅(qū)動框架探路(一):工欲善其事,必先利其器(linux驅(qū)動開發(fā))-鴻蒙HarmonyOS技術(shù)社區(qū)

從上圖中可以看出單片機裸機程序是可以直接控制硬件的,而在linux應(yīng)用程序中這一招就行不通了。linux必須通過驅(qū)動程序來控制操作硬件,OK,暫且先知道這么多,更詳細的問題比如linux為什么要這樣子做,我們先留著這些疑問,飯要一口一口吃。

總體架構(gòu)圖

 HDF驅(qū)動框架探路(一):工欲善其事,必先利其器(linux驅(qū)動開發(fā))-鴻蒙HarmonyOS技術(shù)社區(qū)

1.應(yīng)用程序

寫應(yīng)用程序的目的主要是為了測試驅(qū)動程序,測試的方法為調(diào)用glibc的open、read、write函數(shù)。

代碼見下:

  1. #include <sys/types.h> 
  2. #include <sys/stat.h> 
  3. #include <fcntl.h> 
  4. #include <unistd.h> 
  5. #include <stdio.h> 
  6. #include <string.h> 
  7.  
  8. int main(int argc, char **argv) 
  9.     int fd; 
  10.     char buf[1024]; 
  11.     int len; 
  12.     int ret; 
  13.  
  14.     if (argc < 2) { 
  15.         printf("Usage: %s -w <string>\n", argv[0]); 
  16.         printf("       %s -r\n",argv[0]); 
  17.         return -1; 
  18.     } 
  19.  
  20.     fd = open("/dev/hello_linux_dri", O_RDWR); 
  21.     if (fd == -1) 
  22.     { 
  23.         printf("can not open file /dev/hello_linux_dri\n"); 
  24.         return -1; 
  25.     } 
  26.     printf("open /dev/hello_linux_dri success\n"); 
  27.     if ((0 == strcmp(argv[1], "-w")) && (argc  == 3)) 
  28.     { 
  29.         len = strlen(argv[2]) + 1; 
  30.         len = len < 1024 ? len : 1024; 
  31.         ret = write(fd, argv[2], len); 
  32.         printf("write driver : %d\n", ret); 
  33.     } else { 
  34.         len = read(fd, buf, 1024); 
  35.         printf("read driver : %d\n", len); 
  36.         buf[1023] = '\0'
  37.         printf("APP read : %s\n", buf); 
  38.     } 
  39.  
  40.     close(fd); 
  41.  
  42.     return 0; 

2.驅(qū)動程序總體邏輯

驅(qū)動程序?qū)儆谀K寫法:預(yù)先注冊自己的的函數(shù)任務(wù),以便服務(wù)于將來的某個請求,然后它的初始化函數(shù)就立即結(jié)束

2.1 環(huán)境確認(rèn)

因為驅(qū)動程序是調(diào)用的內(nèi)核頭文件,所以首先需要確認(rèn)頭文件有沒有,下面第一條命令是確認(rèn)有沒有,沒有的話,使用第二條進行下載。

  1. apt-cache search linux-headers-$(uname -r) 
  2. sudo apt-get install linux-headers-$(uname -r) 

2.2 驅(qū)動框架代碼搭建

代碼見下圖:

  1. #include <linux/module.h> 
  2. #include <linux/fs.h> 
  3. #include <linux/device.h> 
  4.  
  5. static int major = 0; 
  6. static int ker_val = 123; 
  7. static struct class *hello_for_class; 
  8. static ssize_t hello_read(struct file *file, char __user *buf, size_t size, loff_t *offset) 
  9.     printk("%s %s line %d\n",__FILE__,__FUNCTION__, __LINE__); 
  10.     return 4; 
  11.  
  12. static ssize_t hello_write(struct file *file, const char __user *buf, size_t size, loff_t *offset) 
  13.     printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__); 
  14.     return 4; 
  15. int __init hello_init(void) 
  16.     printk("hello_linux_dri init\n"); 
  17.     return 0; 
  18. void __exit hello_exit(void) 
  19.     printk("hello_linux_dri exit\n"); 
  20.     return
  21. module_init(hello_init); 
  22. module_exit(hello_exit); 
  23. MODULE_LICENSE("GPL"); 

上述就是驅(qū)動代碼的一個基本框架

3.注冊驅(qū)動

使用file_operations結(jié)構(gòu)體來填充register_chrdev函數(shù)來注冊驅(qū)動

  1. static struct file_operations hello_linux_fops = { 
  2.     .owner = THIS_MODULE, 
  3.     .read = hello_read, 
  4.     .write = hello_write, 
  5. }; 
  6. int __init hello_init(void) 
  7.     printk("hello_linux_dri init\n"); 
  8.     major = register_chrdev(0,"hello_linux_dri", &hello_linux_fops); 
  9.     return 0; 

4.注銷驅(qū)動

使用unregister_chrdev函數(shù)來注銷注冊中的驅(qū)動信息

  1. void __exit hello_exit(void) 
  2.     printk("hello_linux_dri exit\n"); 
  3.     unregister_chrdev(major, "hello_linux_dri"); 
  4.     return

5.自動生成設(shè)備文件來使用驅(qū)動

5.1 生成設(shè)備文件

使用class_create和device_create來進行生成,代碼如下:

  1. int __init hello_init(void) 
  2.     printk("hello_linux_dri init\n"); 
  3.     major = register_chrdev(0,"hello_linux_dri", &hello_linux_fops); 
  4.     hello_for_class = class_create(THIS_MODULE, "hello_class"); 
  5.     device_create(hello_for_class, NULL, MKDEV(major, 0), NULL"hello_linux_dri"); 
  6.  
  7.     return 0; 

5.2 撤銷設(shè)備文件

使用device_destroy和class_destroy進行撤銷,代碼如下:

  1. void __exit hello_exit(void) 
  2.     printk("hello_linux_dri exit\n"); 
  3.  
  4.     device_destroy(hello_for_class, MKDEV(major, 0)); 
  5.     class_destroy(hello_for_class); 
  6.     unregister_chrdev(major, "hello_linux_dri"); 
  7.  
  8.     return

效果如下:

HDF驅(qū)動框架探路(一):工欲善其事,必先利其器(linux驅(qū)動開發(fā))-鴻蒙HarmonyOS技術(shù)社區(qū)

文章相關(guān)附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1513

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2010-02-24 10:39:48

2021-06-16 09:22:10

鴻蒙HarmonyOS應(yīng)用

2012-11-09 17:15:29

遨游瀏覽器

2018-07-02 15:46:18

Python編輯器經(jīng)驗

2018-12-11 14:25:19

JFrogKubernetesDevOps

2017-02-07 15:15:20

大數(shù)據(jù)數(shù)據(jù)分析數(shù)據(jù)挖掘

2016-12-16 14:18:54

2014-04-30 13:50:00

VS2013VS2013技巧

2020-10-10 14:48:18

Python安裝

2010-10-27 09:33:18

MVC開發(fā)

2023-02-07 16:11:41

2021-05-06 15:15:13

Python工具代碼

2021-12-15 15:30:38

鴻蒙HarmonyOS應(yīng)用

2021-03-03 14:50:55

安全自動化機器學(xué)習(xí)網(wǎng)絡(luò)安全

2021-03-29 11:20:39

前端代碼工作流

2021-02-11 09:12:14

開發(fā)IDEA后綴

2011-08-05 10:48:11

iPhone開發(fā) Objective- Cocoa Touc

2020-07-08 14:10:30

開發(fā)技能工具

2021-11-30 14:52:41

鴻蒙HarmonyOS應(yīng)用

2013-11-07 10:20:36

點贊
收藏

51CTO技術(shù)棧公眾號