在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux下驅動開發

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-09-20 09:00 ? 次閱讀

Linux下驅動開發

1.簡介

驅動,是指驅動計算機里軟件的程序。驅動程序全稱設備驅動程序,是添加到操作系統中的特殊程序,其中包含有關硬件設備的信息。驅動程序是操作系統與硬件連接的橋梁。
設備驅動最通俗的解釋就是“驅使硬件設備行動”。驅動與底層硬件直接打交道,按照硬件設備的具體工作方式,讀寫設備的寄存器,完成設備的輪詢、中斷處理、DMA通信,進行物理內存向虛擬內存的映射等,最終讓通信設備能收發數據,讓顯示設備能顯示文字和畫面,讓存儲設備能記錄文件和數據。

2.驅動分類

Linux驅動分類:
字符設備、塊設備、網絡設備。
網絡設備: 有線網卡、無線網卡、其它與網絡相關的設備。
塊設備: U盤、SD卡、硬盤、光盤等。
字符設備: 除了塊設備和網絡設備,其它都歸結于字符設備。
字符設備中分類: 雜項設備、輸入設備(鍵盤、鼠標、觸摸屏)、幀緩沖(顯示類設備)、RTC設備、串口設備等。

3.雜項設備

pYYBAGMoThuAXtjZAACGh6k1cfM063.png#pic_center

驅動程序是應用層和硬件層的連接橋梁,應用層只管完成應用邏輯開發和界面設計,驅動層則處理硬件配置,實現應用層相關接口函數。
雜項設備:字符設備類的一種,是除了上述輸入設備、幀緩沖設備、RTC設備后的其它設備,例LED設備,由于不好歸結于上述分類,則可將LED設備按雜項設備類進行注冊。雜項設備主設備號為10。
在生成的設備節點中,主設備號用來區分設備類。如字符設備中雜項設備主設備號為10,幀緩沖設備主設備號為29;次設備號用來區分這個類中的具體硬件。

4.驅動注冊框架

4.1開發平臺

開發平臺:Ubuntu18.04
編譯器:arm-linux-gcc
硬件平臺:tiny4412基于Cortex-A9 4核1.5GHZ
開發板內核:Linux3.5

poYBAGMoThyAFONuAAhfvDjkbsA493.png#pic_center

4.2 驅動模板

#include 
#include 
/*驅動初始化*/
static int __init wbyq_hello_module_init(void)
{
    printk("驅動入口,驅動注冊成功n");
    return 0;
}
/*驅動釋放*/
static void __exit wbyq_hello_module_cleanup(void)
{
    printk("驅動出口,驅動注銷成功n");
}
module_init(wbyq_hello_module_init);//驅動入口函數
module_exit(wbyq_hello_module_cleanup);//驅動出口函數

MODULE_LICENSE("GPL");//驅動注冊協議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 hello Driver");

4.3 驅動編譯

KER_ADD=/home/wbyq/src_pack/linux-3.5  #linux3.5內核的Makefile位置
all:
	make -C $(KER_ADD) M=`pwd` modules #通過調用linux3.5內核的Makefile文件進行編譯
	cp ./*.ko /home/wbyq/src_pack/rootfs/code #將驅動文件拷貝到code目錄下
	make -C $(KER_ADD) M=`pwd` modules clean  #清空文件
obj-m +=hello_drv.o #添加依賴文件

4.4 驅動安裝

[root@wbyq code]# insmod hello_drv.ko  #安裝驅動
[ 4684.795000] 驅動入口,驅動注冊成功

[root@wbyq code]# modinfo hello_drv.ko  #查看驅動詳細信息
modinfo: can't open '/lib/modules/3.5.0-FriendlyARM/modules.dep': No such file or directory
[root@wbyq code]# mkdir /lib/modules/3.5.0-FriendlyARM/ -p
[root@wbyq code]# touch /lib/modules/3.5.0-FriendlyARM/modules.dep
[root@wbyq code]# lsmod #查看動態安裝的驅動
hello_drv 612 0 - Live 0xbf000000 (O)
[root@wbyq code]# rmmod hello_drv.ko #注銷驅動
[ 5610.635000] 驅動出口,驅動注銷成功

5 編寫蜂鳴器驅動

5.1 硬件接口

pYYBAGMoThyAcqAWAAB785gbBRc774.png#pic_center

??蜂鳴接口:BP1 – GPD0_0 高電平驅動。

poYBAGMoTh2ALh5zAAFIVeaUTtI355.png#pic_center

?? GPD0_CON:0x1140 0000+0x00A0 --配置寄存器

pYYBAGMoTh2AHTkFAADx1i9W8rc801.png#pic_center

5.2 蜂鳴器驅動層

?? 1.調用驅動注冊和注銷函數,在驅動入口函數中實現BEEP硬件接口配置。在驅動出口函數中完成硬件資源釋放。
?? 2.通調用雜項設備驅動框架完成雜項設備注冊,注冊成功后在/dev生成beep的設備節點。完成應用層相關接口函數編寫。

#include 
#include 
#include 
#include 
#include 
/*驅動初始化*/
unsigned int *GPDO_CON;
unsigned int *GPDO_DAT;
int beep_open(struct inode *inode, struct file *file)/*對應應用層open函數*/
{
	printk("open函數調用成功n");
	return 0;
}

int beep_release(struct inode *inode, struct file *file) /*對應應用層close*/
{
	printk("releasse函數調用成功n");
	*GPDO_DAT&=~(1<<0);
	return 0;
}
ssize_t beep_read(struct file *file, char __user * data, size_t size, loff_t *offset)/*對應應用層read*/
{
	int *p=(int *)data;
	*p=123;
	printk("read函數調用成功n");
	return 4;
}
ssize_t beep_write(struct file *file, const char __user *data, size_t size, loff_t *offset)/*對應應用層write*/
{
	char buff[20];
	memcpy(buff,data,size);
	buff[size]='';
	printk("buff=%sn",buff);
	if(strcmp(buff,"beep_on")==0)//開蜂鳴器
	{
		*GPDO_DAT|=1<<0;
	}
	else if(strcmp(buff,"beep_off")==0)//關蜂鳴器
	{
		*GPDO_DAT&=~(1<<0);
	}
	return size;//返回寫入成功的字節數
}

/*文件操作集合結構體*/
static struct file_operations beep_fops=
{
	.owner		= THIS_MODULE,/*當前模塊*/
	.open		= beep_open,
	.release	= beep_release,
	.read		=beep_read,
	.write		=beep_write
};
/*雜項設備結構體*/
static struct miscdevice tiny4412_beep = {
	.minor			= MISC_DYNAMIC_MINOR,//次設備號,255表示由系統自動分配
	.name			= "beep", /*在/dev生成的設備節點名字*/
	.fops			= &beep_fops,
};
static int __init wbyq_beep_init(void)
{
    printk("驅動入口,驅動注冊成功n");
	/*蜂鳴器配置*/
	GPDO_CON=ioremap(0x114000A0, 4);//將GPDO_CON物理地址轉換虛擬地址
	GPDO_DAT=ioremap(0x114000A4, 4);//將GPDO_DAT物理地址轉換虛擬地址
	/*蜂鳴器*/
	*GPDO_CON&=0xfffffff0;//清除當前GPD0_0的配置
	*GPDO_CON|=0x00000001;//設置為輸出模式
	/*注冊雜項設備:在/dev下生成設備節點,實現應用層接口函數*/
	misc_register(&tiny4412_beep);
    return 0;
}
/*驅動釋放*/
static void __exit wbyq_beep_cleanup(void)
{
    printk("驅動出口,驅動注銷成功n");
	/*注銷雜項設備*/
	misc_deregister(&tiny4412_beep);
	iounmap(GPDO_CON);
	iounmap(GPDO_DAT);
}
module_init(wbyq_beep_init);//驅動入口函數
module_exit(wbyq_beep_cleanup);//驅動出口函數

MODULE_LICENSE("GPL");//驅動注冊協議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 beep Driver");

?? 雜項設備主設備為10,次設備可填值為0~254;當次設備號填255時表示有系統分配。

5.3 蜂鳴器應用層

?? Linux下一切皆文件,操作設備就和操作文件一樣。只需要open打開設備、讀寫設備、操作完成關閉設備即可。

#include 
#include 
#include 
#include 
#include 
#include 
int main()
{
	/*1.打開設備*/
	int fd=open("/dev/beep",2);
	if(fd<0)
	{
		printf("/dev/beep 設備打開失敗n");
		return 0;
	}
	int data=0;
	int size;
	/*讀寫文件*/
	size=read(fd,&data,4);
	printf("size=%d,data=%dn",size,data);
	while(1)
	{
		write(fd,"beep_on",strlen("beep_on"));//開蜂鳴器
		sleep(1);
		write(fd,"beep_off",strlen("beep_off"));//關蜂鳴器
		sleep(1);
	}
	close(fd);//關閉文件
}

? 在Linux內核中,設備節點的訪問是通過主設備+次設備號的組合來完成的,占32位,主設備號是20 ~ 31位。次設備號是0 ~ 19位。

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40289
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209483
  • 驅動開發
    +關注

    關注

    0

    文章

    130

    瀏覽量

    12077
收藏 人收藏

    評論

    相關推薦

    自學買什么開發板比較好,求推薦

    有比較長的linux基礎,也有單片機的開發經驗。現在想自學 arm 和linux驅動開發,內
    發表于 05-09 22:05

    【NanoPi2申請】簡單人臉識別

    這是很好的發展方向。我現在正在學習linux的一些基本操作,打算做linux驅動開發,本來
    發表于 12-18 14:37

    嵌入式Linux設備驅動開發

    嵌入式Linux設備驅動開發 Linux 設備驅動的基本概念Linux 設備
    發表于 09-10 13:10 ?82次下載
    嵌入式<b class='flag-5'>Linux</b>設備<b class='flag-5'>驅動</b><b class='flag-5'>開發</b>

    Linux基于I2C協議的RTC驅動開發

    首先研究了Linux環境字符設備驅動程序框架,然后介紹12C協議,在此基礎上開發基于12C協議的RTC字符設備驅動程序。砷于
    發表于 03-02 16:15 ?48次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>基于I2C協議的RTC<b class='flag-5'>驅動</b><b class='flag-5'>開發</b>

    嵌入式LinuxARM_DSP通信接口設計及驅動開發

    嵌入式LinuxARM_DSP通信接口設計及驅動開發
    發表于 05-19 11:17 ?0次下載

    基于嵌入式LinuxARM_DSP通信接口設計及驅動開發

    基于嵌入式LinuxARM_DSP通信接口設計及驅動開發
    發表于 10-19 10:38 ?12次下載
    基于嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>下</b>ARM_DSP通信接口設計及<b class='flag-5'>驅動</b><b class='flag-5'>開發</b>

    如何編寫Linux Nand Flash驅動

    如何編寫Linux Nand Flash驅動
    發表于 10-30 08:36 ?15次下載
    如何編寫<b class='flag-5'>Linux</b> <b class='flag-5'>下</b>Nand Flash<b class='flag-5'>驅動</b>

    基于Linux的LCD驅動程序實現

    基于Linux的LCD驅動程序實現
    發表于 10-30 16:45 ?12次下載
    基于<b class='flag-5'>Linux</b><b class='flag-5'>下</b>的LCD<b class='flag-5'>驅動</b>程序實現

    LinuxPCI設備驅動程序開發

    PCI是一種廣泛采用的總線標準,它提供了許多優于其它總線標準(如EISA)的新特性,目前已經成為計算機系統中應用最為廣泛,并且最為通用的總線標準。Linux的內核能較好地支持PCI總線,本文以Intel 386體系結構為主,探討了在Linux
    發表于 04-26 17:00 ?1046次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>PCI設備<b class='flag-5'>驅動</b>程序<b class='flag-5'>開發</b>

    ARM11嵌入式系統LinuxLCD的驅動的設計

    ARM11嵌入式系統LinuxLCD的驅動的設計(嵌入式開發啥意思)-ARM11嵌入式系統Linux
    發表于 07-30 14:53 ?24次下載
    ARM11嵌入式系統<b class='flag-5'>Linux</b><b class='flag-5'>下</b>LCD的<b class='flag-5'>驅動</b>的設計

    嵌入式linux報警,嵌入式LinuxLED報警燈驅動設計及編程.doc

    設計及編程一.實驗目的理解驅動本質,掌握嵌入式Linux系統驅動開發相關知識,包括端口寄存器訪問、接口函數編寫、和文件系統掛接、注冊及相關
    發表于 11-01 17:21 ?6次下載
    嵌入式<b class='flag-5'>linux</b>報警,嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>下</b>LED報警燈<b class='flag-5'>驅動</b>設計及編程.doc

    Linux設備驅動開發詳解

    Linux設備驅動開發詳解
    發表于 10-28 11:03 ?50次下載

    如何驅動Linux開發板LED燈

    Linux的任何外設驅動,最終都是要配置相應的硬件寄存器。前面的文章中介紹了新舊字符設備的驅動開發框架,也介紹了IMX6ULL處理器GPI
    的頭像 發表于 04-14 11:41 ?963次閱讀
    如何<b class='flag-5'>驅動</b><b class='flag-5'>Linux</b><b class='flag-5'>開發</b>板LED燈

    如何學習Linux驅動開發

    困惑,面對復雜的Linux內核有一種無從下手的感覺。今天就和大家分享一,讓剛剛步入驅動開發的同學少走一些彎路。01要知道將來要做什么學習,都是有目的性的,要么是興
    的頭像 發表于 01-06 16:34 ?913次閱讀
    如何學習<b class='flag-5'>Linux</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>?

    Linux 驅動開發與應用開發,你知道多少?

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux
    的頭像 發表于 08-30 12:16 ?789次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅動</b><b class='flag-5'>開發</b>與應用<b class='flag-5'>開發</b>,你知道多少?
    主站蜘蛛池模板: nxgx欧美| 免费看日本大片免费| 天堂网在线www资源网| 美女免费视频色在线观看| 亚洲欧美一区二区三区麻豆| 午夜短视频| 国产亚洲视频在线播放大全| 欧美精品四虎在线观看| 四虎院影永久在线观看| 美女把尿口扒开让男人桶出水 | 亚欧色视频在线观看免费| 亚洲 欧美 视频| 在线观看视频h| 欧美黄色免费| 午夜看片| 免费一看一级毛片全播放| 天天艹夜夜| 天天做夜夜爱| 午夜免费观看_视频在线观看 | 亚洲综合色婷婷在线观看| 能可以直接看的av网址| 69日本xxxxhd| 国产黄色小视频网站| 222aaa免费国产在线观看| 黄色网日本| 免费人成黄页在线观看1024| 操综合| 国产精品波多野结衣| 久久影视免费观看网址| 深夜影院一级毛片| 青青热久久国产久精品秒播| 日日做夜夜爽夜夜爽| 88av视频在线观看| 久久久久国产一级毛片高清版 | 人人艹人人草| 国产hs免费高清在线观看| 国产精品成人aaaaa网站| www.午夜| tom影院亚洲国产一区二区| 天天躁日日躁成人字幕aⅴ| 色五月激情五月|