1. 程式人生 > >linux驅動開發之一個真正的裝置驅動需要一些什麼元素(裝置號,操作方法)

linux驅動開發之一個真正的裝置驅動需要一些什麼元素(裝置號,操作方法)

1,需要一個裝置號(重點看下面的程式碼)
因為核心中有很多的裝置驅動,所以需要一個裝置號id來進行區分
裝置號分成兩個部分:
主裝置號:某一類裝置
次裝置號: 某類裝置中某個裝置裝置
比如:前置和後置攝像頭都是camera這類裝置
前置 : 0
後置 : 1
在核心中: dev_t來表示裝置號,
32bit的整數
高12bit: 主裝置號
低20bit:次裝置號
(1)申請裝置號函式
//引數1—指定一個號碼也可以由系統分配,填0表示由系統分配
//引數2–字串–描述裝置驅動資訊–自定義
//引數3—檔案操作物件
// 返回值—如果是系統分配,返回分配之後的號碼,否則返回負數為錯誤
int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)

(2)解除安裝裝置號函式
//引數1—已經申請到的裝置號
//引數2–字串–描述裝置驅動資訊–自定義
void unregister_chrdev(unsigned int major, const char *name)
備註:怎樣在開發板檢視驅動模組是否裝載成功 用cat /proc/devices

2,需要一個裝置檔案
linux中將所有的裝置都看成是檔案,操作裝置其實就是操作檔案
裝置檔案稱為裝置節點

系統中所有的裝置節點都在    ls -l /dev/
        crw--w----  1 root     tty       4,  10 Nov 23 00:41 tty10
        crw--w----  1 root     tty       4,  11 Nov 23 00:41 tty11
        crw--w----  1 root     tty       4,  12 Nov 23 00:41 tty12

(c表示字元裝置,b表示塊裝置)

    建立: 手動和自動建立
        手動:每次都要建立, /dev中所有的檔案都是在記憶體中
            mknod 檔名   型別 主裝置號  次裝置號

            mknod /dev/hello c 254 0

        [[email protected] /drv_module]# ls /dev/hello -l
        crw-r--r--    1 0        0         254,   0 Jan  1 00:52 /dev/hello

驅動可以操作底層硬體,並且為應用服務的,例如驅動可以操控led亮或者滅,但是怎樣亮滅,亮滅多久,是應用程式決定的。即如果只有驅動程式,沒有應用程式,驅動程式就沒有任何作用


這裡寫圖片描述
3,需要一個裝置的操作方法

    int hello_drv_open(struct inode *inode, struct file *filp)
    {

        printk("-------^_^ %s-------\n", __FUNCTION__);
        return 0;

    }


    const struct file_operations hello_fops = {
        .open = hello_drv_open,

    };

編譯工具:source insight 4.0
驅動程式:hello_drv.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>

static int dev_major;//申請的裝置號

int hello_drv_open(struct inode *inode, struct file *filp)
{

    printk("-------^_^ %s-------\n", __FUNCTION__);
    return 0;

}

//檔案操作物件int (*open) (struct inode *, struct file *);
const struct file_operations hello_fops = {
    .open = hello_drv_open,//當應用程式呼叫open,實際是呼叫驅動程式中(該程式)的xxx_open()   

};

//實現驅動模組的裝載函式-----insmod
// 模組載入函式中主要完成系統資源的申請
static int __init hello_init(void)
{
    printk("-------^_^ %s-------\n", __FUNCTION__);

    // 需要有一個裝置號----申請/註冊
    //引數1---指定一個號碼也可以由系統分配,填0表示由系統分配
    //引數2--字串--描述裝置驅動資訊--自定義--/proc/devices
    //引數3---檔案操作物件
    // 返回值---如果是系統分配,返回分配之後的號碼,否則返回負數為錯誤
    dev_major = register_chrdev(0, "hello_drv",  &hello_fops);
    if(dev_major < 0)
    {
        printk("register_chrdev error\n");
        return -EINVAL;//注意有負號
    }
    return 0;
}

//實現驅動模組的解除安裝函式
// 模組解除安裝函式中主要完成系統資源的釋放
static void __exit hello_exit(void)
{
    printk("-------^_^ %s-------\n", __FUNCTION__);

    //引數1---已經申請到的裝置號
    //引數2--字串--描述裝置驅動資訊--自定義
    //解除安裝這型別的函式一般沒有返回值
    unregister_chrdev(dev_major, "hello_drv");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

應用程式:hello_app.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
    int fd = open("/dev/hello", O_RDWR);
    return 0;
}

Makefile

CROSS_COMPILE = arm-none-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc
APP_NAME = hello_app
MODULE_NAME = hello_drv

#核心原始碼路徑
KERNEL_DIR = /home/ubuntu/s5pv210/kernel/linux-3.0.8

CUR_DIR = $(shell pwd)

all :
    #表示進入到核心目錄,並且告訴核心要將當前的原始碼編譯成模組
    make -C $(KERNEL_DIR) M=$(CUR_DIR) modules 
    $(CC) $(APP_NAME).c -o  $(APP_NAME)

clean : 
    make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
    rm -rf $(APP_NAME) 


install:
    cp -raf  *.ko $(APP_NAME)  /opt/rootfs/drv_module/


#指定編譯哪個原始檔
obj-m = $(MODULE_NAME).o

執行應用程式./hello.app
這裡寫圖片描述
檢視裝置節點:
cat /proc/devices
這裡寫圖片描述
可知裝置號為254,裝置節點時hello_drv

相關推薦

linux驅動開發之一真正裝置驅動需要一些什麼元素裝置操作方法

1,需要一個裝置號(重點看下面的程式碼) 因為核心中有很多的裝置驅動,所以需要一個裝置號id來進行區分 裝置號分成兩個部分: 主裝置號:某一

有關IOS開發寫的好的部落格和網站持續更新含盲點

1. Swift中的trim方法處理字串:http://www.hangge.com/blog/cache/detail_1649.html 2. Swift語言中的@available和#available https://blog.csdn.net/offbye/article/deta

ZYNQ Linux驅動開發——第一字元裝置驅動

硬體平臺:XCZ7020 CLG484-1 完全適配Zedboard 開發環境:Widows下Vivado 2016.2 、 SDK2016.2 、 Linux機器:debin 目的:操作板載的LED燈LD9,受PS部分的MIO7控制 linux裝置驅

linux驅動開發之蜂鳴器驅動源碼分析

linux 蜂鳴器 驅動 蜂鳴器的驅動源碼在/driver/char/buzzer/x210-buzzer.c文件中,源碼如下#include <linux/module.h> #include <linux/kernel.h> #include <linux

Windows驅動開發,幾BLOG值得經常看看

 對於從事Windows驅動開發的朋友,或者是對Windows核心感興趣的朋友,以下幾個BLOG值得經常看看! 2,Larry Osterman's WebLog - Confessions of an Old Fogey 3,Raymond Chen的The Old N

Windows驅動開發技術詳解__驅動程式的同步處理

如果驅動程式沒有很好地處理同步問題,作業系統的效能就會下降,甚至出現死鎖等現象。 基本概念 1.問題的引出 下面這段程式碼: int number; void Foo() { number++; //做一些事情 number--; } 將其轉換成

Android開發之一簡單的通訊錄實現原始碼

通訊錄就是一個ListView,我們需要通過資料庫和ContentProvider來活動通訊錄的資料,當然,我們應該提供選中後編輯的功能。 很簡單的一個通訊略Demo,所以,直接上程式碼,需要的看一下就知道。不解釋。 檔案1: MyContacs 主活動頁面。 packag

Linux 網路程式設計之一簡單的客戶端伺服器程式

1、服務端#include "includes.h" #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> #define SERV

【Spring註解驅動開發】聊聊Spring註解驅動開發那些事兒!

## 寫在前面 > 今天,面了一個工作5年的小夥伴,面試結果不理想啊!也不是我說,工作5年了,問多執行緒的知識:就只知道繼承Thread類和實現Runnable介面!問Java集合,竟然說HashMap是執行緒安全的!問MySQL的MyISAM儲存引擎和InnoDB儲存引擎的區別,竟然說成是MyISA

【Spring註解驅動開發】使用InitializingBean和DisposableBean來管理bean的生命週期你真的瞭解嗎?

## 寫在前面 > 在《[【Spring註解驅動開發】如何使用@Bean註解指定初始化和銷燬的方法?看這一篇就夠了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7e

【Spring註解驅動開發】如何使用@Value註解為bean的屬性賦值我們一起吊打面試官!

## 寫在前面 > 在之前的文章中,我們探討了如何向Spring的IOC容器中註冊bean元件,講解了有關bean元件的生命週期的知識。今天,我們就來一起聊聊@Value註解的用法。 > > 專案工程原始碼已經提交到GitHub:[https://github.com/sunshinely

Linux裝置模型分析之bus基於3.10.1核心

作者:劉昊昱  核心版本:3.10.1 一、bus定義 Linux裝置驅動模型中的bus,即可以是物理匯流排(如PCI、I2C匯流排)的抽象,也可以是出於裝置驅動模型架構需要而定義的虛擬的“platform”匯流排。一個符合Linux裝置驅動模型的device或devi

Linux裝置模型分析之device_driver基於3.10.1核心

一、device_driver定義 181/**  182 * struct device_driver - The basic device driver structure  183 * @name:   Name of the device

這些HTML、CSS知識點面試和平時開發需要 No8-No9知識點:媒體操作、構建表單

password 添加屬性 自己 oval 系列 文件上傳 htm color eth 系列知識點匯總 這些HTML、CSS知識點,面試和平時開發都需要 No1-No4(知識點:HTML、CSS、盒子模型、內容布局) 這些HTML、CSS知識點,

2017高德地圖API WEB開發key申請地圖搭建簡約教程

height 圖層 類型 開發文檔 doctype content 如何 加載 innerhtml 前端時間因為公司需要研究 了一下百度的教程 然後寫個簡約的筆記記錄一下自己學習的收獲,只為了滿足自己暫時的寫作熱情 高德地圖WEB開發(key申請、api)簡

linux實戰考試題:批量創建用戶和密碼不能使用循環

linux 實戰 批量創建10個用戶,並且設置隨機8位密碼,要求不能用shell的循環(例如:for,while等),只能用linux命令及管道實現。方法1:[[email protected]/* */ /]# echo stu{01..10}|tr " " "\n"|sed -r ‘s

linux: cmake未完更新中

linux add ++ required version options tail rect exec 參考: http://blog.csdn.net/netnote/article/details/4051620 http://blog.csdn.net/fan_

Linux九陰真經之催心掌殘卷9文件壓縮與歸檔

生成 initramfs col linux 指定 compress zip 拷貝 mnt 一:壓縮、解壓 1、compress/uncompress/zcat -d:解壓 -c:輸出到終端,不刪除原文件 -v:顯示詳細信息 2、gzip/ungzip/zcat -d

DDD實戰進階第一波(五):開發一般業務的大健康行業直銷系統實現產品上下文領域層

討論 clas 基本 ted ctc decimal nco protect pan 從這篇文章開始,我們根據前面的DDD理論與DDD框架的約束,正式進入直銷系統案例的開發。 本篇文章主要講產品上下文中的領域層的主要實現,先簡單講下業務方面的需求:產品SPU與產品SKU,產

Linux九陰真經之無影劍殘卷7進程和計劃任務

指令 img CP 正在 技術分享 如果 cow 存在 進程 進程概念 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等Process: 運行中的程序的一個副本,是被載入內存的一個指令集合進程ID(Process ID,PID)號碼被用來標記各個進程