Linux LED驅動原始碼簡析
驅動的載入與解除安裝函式
驅動載入服務函式
int major;
static int first_drv_init(void)
{
major = register_chrdev(0, "first_drv",
&first_drv_fops);
// 註冊驅動,其中第一個引數為0,則表示採用系統動態分配的主裝置號
//第二個引數是其註冊的裝置名
//第三個很重要的引數,就是我們配置驅動函式的結構
//(具體見上一篇對該函式的解析)
firstdrv_class = class_create(THIS_MODULE,
"firstdrv");
//建立一個驅動類
firstdrv_class_dev =
class_device_create(firstdrv_class, NULL,
MKDEV(major, 0), NULL, "xyz"); /* /dev/xyz */
//用於自動的在系統的目錄下建立一個字元裝置的節點
gpfcon = (volatile unsigned long
*)ioremap(0x56000050, 16);
//通過記憶體對映到真實地址
gpfdat = gpfcon + 1;
//配置GPIO為輸出
return 0;
}
驅動解除安裝服務函式
static void first_drv_exit(void)
{
unregister_chrdev(major, "first_drv");
//告訴核心,解除安裝該驅動
//major是程式的主裝置號
class_device_unregister(firstdrv_class_dev);
class_destroy(firstdrv_class);
//這兩句用於刪除在檔案系統中建立的節點
iounmap(gpfcon);
//取消GPIO的對映
}
最後別忘了,把這兩個函式註冊進去
module_init(first_drv_init);
module_exit(first_drv_exit);
重要的結構體
static struct file_operations first_drv_fops = {
.owner = THIS_MODULE,
/* 這是一個巨集,推向編譯模組時自動建立的__this_module變數 */
//說是與神祕高階特性有關,不懂,先這麼寫
.open = first_drv_open,
.ioctl = first_drv_ioctl,
};
用來儲存驅動核心模組提供的對裝置進行各種操作的函式的指標。該結構體的每個域都對應著驅動核心模組用來處理某個被請求的事務的函式的地址
驅動函式
open()函式
static int first_drv_open(struct inode *inode, struct
file *file)
{
printk("first_drv_open\n");
/* 配置GPF4,5,6為輸出 */
......
return 0;
}
ioctl()函式
這個函式比較重要,用於應用程式到驅動程式的引數傳遞
int ioctl(int fd, ind cmd, …);
//最多可以傳遞三個引數
static int first_dev_ioctl(struct inode *inode,
struct file *file, int cmd, int arg)
{
printk("first_drv_ioctl\n");
......
}
證書
因為Linux遵循GNU/GPL ,所以要在核心做出宣告
(要不,核心會傲嬌…)
MODULE_LICENSE("GPL");
就此,一個簡單的led的驅動程式就是分析完了,下面開始說說,驅動是如何被使用的。
在應用層,和硬體層之間的中間層,就是驅動所在的位置那麼我們的驅動程式,一定是要通過應用程式呼叫的
驅動測試程式
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char **argv)
{
int fd;
fd = open("/dev/xyz", O_RDWR);
if (fd < 0) {
printf("can't open!\n");
}
...
ioctl(fd, strtol(argv[2]));
return 0;
}
一套驅動就算完成了,
長路漫漫,這這只是最簡單的第一步
相關文章
- linux驅動之LED驅動Linux
- 新字元驅動框架驅動LED字元框架
- vuex 原始碼簡析Vue原始碼
- 【linux】驅動-4-LED晶片手冊分析Linux晶片
- minipack 原始碼簡析原始碼
- LED字元裝置驅動字元
- led驅動程式例項
- ElementUI 原始碼簡析——原始碼結構篇UI原始碼
- 嵌入式Linux中的LED驅動控制(續)Linux
- Gulp.task() 原始碼簡析原始碼
- Gin使用及原始碼簡析原始碼
- LED驅動晶片(IC)-VK1616 SOP/DIP16,LED數顯/數碼管顯示驅動晶片晶片
- dw_apb_i2c驅動簡析
- [ thanos原始碼分析系列 ]thanos query元件原始碼簡析原始碼元件
- SparseArray詳解及原始碼簡析原始碼
- AntV X6原始碼簡析原始碼
- dagger2原始碼簡析原始碼
- 嵌入式Linux中的LED驅動控制(基於misc)Linux
- linux核心原始碼閱讀-塊裝置驅動Linux原始碼
- Linux驅動開發筆記(一):helloworld驅動原始碼編寫、makefile編寫以及驅動編譯Linux筆記原始碼編譯
- LinkedHashMap 詳解及原始碼簡析HashMap原始碼
- gfx-hal Texture操作原始碼簡析原始碼
- Vue原始碼簡析(版本vue-2.4.4)Vue原始碼
- 嵌入式Linux中的LED驅動控制(裝置樹方式)Linux
- linux平臺匯流排驅動裝置模型之點亮LEDLinux模型
- 嵌入式Linux中的LED驅動控制(裝置樹方式)(續)Linux
- 併發系列(二)——FutureTask類原始碼簡析原始碼
- Vue原始碼簡析之檢視生成(上)Vue原始碼
- Laravel 原始碼分析——Eloquent 的工作原理簡析Laravel原始碼
- 裝置樹下的 LED 驅動實驗
- Linux 記憶體池原始碼淺析Linux記憶體原始碼
- 【.NET 與樹莓派】LED 數碼管驅動模組——TM1638樹莓派
- VK16K33LED數碼管顯示驅動晶片/LED數顯驅動晶片內建顯示記憶體及RC振盪電路晶片記憶體
- LED驅動IC,數顯驅動控制電路-數碼管顯示驅動晶片-VK1629 LQFP44技術資料晶片
- 點陣LED數碼管驅動VK16K33BA SSOP24高亮數顯驅動晶片/數顯驅動IC廠家晶片
- Vue原始碼分析之資料驅動Vue原始碼
- Redis 原始碼學習之事件驅動Redis原始碼事件
- 嵌入式Linux中的LED驅動控制(使用多個次裝置號)Linux