17、字符设备控制技术
字符設備控制技術
前面的學習,我們學習了驅動程序,實現程序的讀寫功能。現在設備還有一項更重要的功能--控制。
控制設備的函數:ioctl。
Cmd:參數是我們發送的命令,例如重啟。
第三個參數:是依賴第二個,例如我們要修改波特率的值,我們就會在第三個參數傳上波特率的值。當第二個不需要參數,就是空值。
前面知道,當我們系統調用read函數的時候,系統會自動調用***.read函數。上面是我們ioctl系統調用的時候,系統調用的函數版本。參數一一對應傳遞。
總結:我們從上面的學習read和write的內容知道,我們在程序里調用read函數,在系統會調用***_read函數,然后找在內核的相應的實現函數。Write也是一樣的:write->***_write,他在內核的實現。所以現在控制程序:ioctl,對應系統的unlock_ioctl,接下來也是看系統是如何實現的。
?
?
?
?
?
?
定義命令:
系統用宏來定義命令:
我們知道類型是8位的,然后一個字母剛好是8位,一個字符例如m。
0是命令的序號,最后int是命令的類型。
?
?
通過上面知道,我們知道了如何實現。下面看程序的實現,功能:第一實現設備的重啟的命令,第二是設參數。
首先是定義命令宏:memdev.h:
接著就是在mem_fops結構里添加我們的控制函數:
接下來就是我實現控制函數:
?
在內核的unlocked_ioctl的函數原型:
從上面我們得到:
Long mem_iotcl(struct file *filp, unsigned int cmd, unsigned long arg).我們知道里面有一個switch的選擇結構。
記得是在struct結構的前面實現
運行的結果:
接下來是寫個應用程序來測試一下,mem_ctl.c:
編譯結果:
?
寫好了驅動程序memdev.ko和應用程序mem_ctl,拷貝到我們的開發板:
首先是安裝memdev.ko驅動并查看主設備號:
接下來創建字符設備文件:memdev0:
接下來運行我們的應用程序:
./mem_ctl執行了這個命令之后會輸出:
Arg is 115200
Restart devices
轉載于:https://www.cnblogs.com/FORFISH/p/5188461.html
總結
以上是生活随笔為你收集整理的17、字符设备控制技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android控件捕获点击事件的范围
- 下一篇: 后缀自动机在复习