1. 程式人生 > >Linux驅動開發HelloWorld

Linux驅動開發HelloWorld

1、編寫原始碼及Makefile檔案

hello.c及Makefile檔案位於目錄/home/dreamcs/kernelwork/learn中。hello.c內容如下:
#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
    printk(KERN_ALERT "hello world!\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "goodbye!\n");
}

module_init(hello_init);
module_exit(hello_exit);

Makefile檔案內容如下:
#下面這行是檔案Makefile的內容,注意M是大寫的
obj-m := hello.o

2.編譯 把hello.c和Makefile儲存在同一目錄,然後執行:
make -C /lib/modules/$(uname -r)/build SUBDIRS=$PWD modules
這樣驅動就編譯好了,成果是hello.ko檔案。
注意:makefile一定要寫成Makefile,如果寫成makefile就編譯不過。


3、載入驅動檢視執行結果
執行
sudo insmod ./hello.ko
在/var/log/syslog檔案中看到如下內容

執行sudo lsmod命令,列出載入的驅動。發現hello驅動在其中。



4.解除安裝驅動 sudo rmmod hello  看見/var/log/syslog裡顯示了goodbye


5.另一種Makefile

#以下是Makefile檔案的內容
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
    make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:
    rm *.o *.ko
然後執行:make就編譯成功了,命令列不再加引數,很省事。

相關推薦

Linux驅動開發HelloWorld

1、編寫原始碼及Makefile檔案 hello.c及Makefile檔案位於目錄/home/dreamcs/kernelwork/learn中。hello.c內容如下: #include <linux/init.h> #include <linux

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

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

linux驅動開發之framebuffer應用編程實踐(一)

linux驅動開發之framebuffer驅動 1、framebuffer應用編程 (1)打開設備文件 (2)獲取設備信息 宏定義的命令在/linux/fb.h中 不可變信息FSCREENINFO,使用ioctl參數有FBIOGET_FSCREENINFO宏名,表示用ioctl從

linux驅動開發記錄

when off ide def pos inux adc version red inode: include/linux/fs.h 1 /* 2 * Keep mostly read-only and often accessed (especially for

linux驅動開發:用戶空間操作LCD顯示簡單的圖片【轉】

res fin blue var chang uil print views statistic 轉自:http://blog.csdn.net/changliang7731/article/details/53074616 上一章我們簡單介紹了LCD的一些基本原

Linux內核(17) - 高效學習Linux驅動開發

橋梁 是我 href 即使 搭建 技術分享 來看 probe 通信 這本《Linux內核修煉之道》已經開賣(網上的鏈接為: 卓越、當當、china-pub ),雖然是嚴肅文學,但為了保證流暢性,大部分文字我還都是斟詞灼句,反復的念幾遍才寫上去的,盡量考慮到寫上去的每段話能夠

Linux驅動開發概述

pos 驅動 字節 訪問 div com OS alt 分享圖片 字符設備是一種按字節來訪問的設備,最小訪問單位是字節。 塊設備最小訪問單位是一個塊,是512個字節。 網絡接口可以是一個硬件設備,如網卡,但也可以是一個純粹的軟件設備,比如回環接口(lo) 驅動學習方法

linux 驅動程序 HelloWorld

形式 lin \n 語法 rmmod release lsmod con 程序 Linux驅動可以直接編譯進內核,也可以以模塊的形式進行加載,前者比較復雜,本文就以模塊的形式加載! vi helloi_driver.c #include <linux/init.

linux驅動開發第二步 驅動模塊傳參(module_param函數使用)

開發 span mac grep god ring linux驅動 usr enter 在驅動的模塊中聲明一下你要傳遞的參數名稱,類型和權限 module_param(變量的名稱,類型,權限); 先上例子 #include <linux/init

linux驅動開發(三) 字符設備驅動框架(自動創建設備節點)

The module __line__ mage fail goto div on() sys 代碼如下 #include <linux/init.h> #include <linux/module.h> #include <linux/ke

linux 驅動開發

分享 ups repl 文件 session obj duplex tor nat 1.安裝 linux2.寫 hello world//hello.c #include <linux/kernel.h> /*Needed by all modules*/ #

linux驅動開發學習--對中斷和核心定時器的學習筆記

一 中斷理解                             &nb

Linux驅動開發(9)——註冊字元裝置

static int scdev_init(void) { int ret = 0,i; dev_t num_dev; printk(KERN_EMERG "numdev_major is %d!\n",numdev_major); printk(KERN_EMERG "

Linux驅動開發(8)——靜態和動態申請字元裝置

先貼一段demo #include <linux/init.h> /*包含初始化巨集定義的標頭檔案,程式碼中的module_init和module_exit在此檔案中*/ #include <linux/module.h> /*包含初始化載入模組的標頭檔案,程

Linux驅動開發(7)——驅動模組傳參

標頭檔案在include/linux/moduleparam.h 傳遞單個引數:module_param(name,type,perm) - name:模組引數的名稱 - type: 模組引數的資料型別(支援int long short uint ulong ushort型

Linux驅動開發(6)——GPIO初始化

gpio-exynos4.c檔案的最後一行core_initcall(exynos4_gpiolib_init); core_initcall代表在linux初始化過程中會呼叫 exynos4_gpiolib_init函式中包括chip = exynos4_gpio_

Linux驅動開發(5)——生成裝置節點

項裝置可以說是對一部分字元裝置的封裝,還有一部分不好歸類驅 動也歸到雜項裝置 雜項裝置初始化部分原始檔“drivers/char/ misc.c”,這一部分通過 Makefile可知,是強制編譯的。 雜項設備註冊標頭檔案include/linux/miscdevice

Linux驅動開發(4)——驅動註冊

結構體platform_driver struct platform_driver { int (*probe)(struct platform_device *);//初始化 int (*remove)(struct platform_device

Linux驅動開發(3)——以module方式註冊裝置

通過 s3c_device_leds_ctl->*smdk4x12_devices[]->platform_add_devices()->platform_device_register() 可以直接使用“platform_device_register()”來註冊裝置

Linux驅動開發(2)——設備註冊

結構體platform_device 註冊裝置使用結構體platform_device,原始碼路徑include/linux/platform_device.h struct platform_device { const char * name;//裝