99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下驅(qū)動(dòng)開(kāi)發(fā)

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-09-20 09:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux下驅(qū)動(dòng)開(kāi)發(fā)

1.簡(jiǎn)介

驅(qū)動(dòng),是指驅(qū)動(dòng)計(jì)算機(jī)里軟件的程序。驅(qū)動(dòng)程序全稱(chēng)設(shè)備驅(qū)動(dòng)程序,是添加到操作系統(tǒng)中的特殊程序,其中包含有關(guān)硬件設(shè)備的信息。驅(qū)動(dòng)程序是操作系統(tǒng)與硬件連接的橋梁。
設(shè)備驅(qū)動(dòng)最通俗的解釋就是“驅(qū)使硬件設(shè)備行動(dòng)”。驅(qū)動(dòng)與底層硬件直接打交道,按照硬件設(shè)備的具體工作方式,讀寫(xiě)設(shè)備的寄存器,完成設(shè)備的輪詢(xún)、中斷處理、DMA通信,進(jìn)行物理內(nèi)存向虛擬內(nèi)存的映射等,最終讓通信設(shè)備能收發(fā)數(shù)據(jù),讓顯示設(shè)備能顯示文字和畫(huà)面,讓存儲(chǔ)設(shè)備能記錄文件和數(shù)據(jù)。

2.驅(qū)動(dòng)分類(lèi)

Linux驅(qū)動(dòng)分類(lèi):
字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備。
網(wǎng)絡(luò)設(shè)備: 有線(xiàn)網(wǎng)卡、無(wú)線(xiàn)網(wǎng)卡、其它與網(wǎng)絡(luò)相關(guān)的設(shè)備。
塊設(shè)備: U盤(pán)、SD卡、硬盤(pán)、光盤(pán)等。
字符設(shè)備: 除了塊設(shè)備和網(wǎng)絡(luò)設(shè)備,其它都?xì)w結(jié)于字符設(shè)備。
字符設(shè)備中分類(lèi): 雜項(xiàng)設(shè)備、輸入設(shè)備(鍵盤(pán)、鼠標(biāo)、觸摸屏)、幀緩沖(顯示類(lèi)設(shè)備)、RTC設(shè)備、串口設(shè)備等。

3.雜項(xiàng)設(shè)備

pYYBAGMoThuAXtjZAACGh6k1cfM063.png#pic_center

驅(qū)動(dòng)程序是應(yīng)用層和硬件層的連接橋梁,應(yīng)用層只管完成應(yīng)用邏輯開(kāi)發(fā)和界面設(shè)計(jì),驅(qū)動(dòng)層則處理硬件配置,實(shí)現(xiàn)應(yīng)用層相關(guān)接口函數(shù)。
雜項(xiàng)設(shè)備:字符設(shè)備類(lèi)的一種,是除了上述輸入設(shè)備、幀緩沖設(shè)備、RTC設(shè)備后的其它設(shè)備,例LED設(shè)備,由于不好歸結(jié)于上述分類(lèi),則可將LED設(shè)備按雜項(xiàng)設(shè)備類(lèi)進(jìn)行注冊(cè)。雜項(xiàng)設(shè)備主設(shè)備號(hào)為10。
在生成的設(shè)備節(jié)點(diǎn)中,主設(shè)備號(hào)用來(lái)區(qū)分設(shè)備類(lèi)。如字符設(shè)備中雜項(xiàng)設(shè)備主設(shè)備號(hào)為10,幀緩沖設(shè)備主設(shè)備號(hào)為29;次設(shè)備號(hào)用來(lái)區(qū)分這個(gè)類(lèi)中的具體硬件。

4.驅(qū)動(dòng)注冊(cè)框架

4.1開(kāi)發(fā)平臺(tái)

開(kāi)發(fā)平臺(tái):Ubuntu18.04
編譯器:arm-linux-gcc
硬件平臺(tái):tiny4412基于Cortex-A9 4核1.5GHZ
開(kāi)發(fā)板內(nèi)核:Linux3.5

poYBAGMoThyAFONuAAhfvDjkbsA493.png#pic_center

4.2 驅(qū)動(dòng)模板

#include 
#include 
/*驅(qū)動(dòng)初始化*/
static int __init wbyq_hello_module_init(void)
{
    printk("驅(qū)動(dòng)入口,驅(qū)動(dòng)注冊(cè)成功n");
    return 0;
}
/*驅(qū)動(dòng)釋放*/
static void __exit wbyq_hello_module_cleanup(void)
{
    printk("驅(qū)動(dòng)出口,驅(qū)動(dòng)注銷(xiāo)成功n");
}
module_init(wbyq_hello_module_init);//驅(qū)動(dòng)入口函數(shù)
module_exit(wbyq_hello_module_cleanup);//驅(qū)動(dòng)出口函數(shù)

MODULE_LICENSE("GPL");//驅(qū)動(dòng)注冊(cè)協(xié)議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 hello Driver");

4.3 驅(qū)動(dòng)編譯

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

4.4 驅(qū)動(dòng)安裝

[root@wbyq code]# insmod hello_drv.ko  #安裝驅(qū)動(dòng)
[ 4684.795000] 驅(qū)動(dòng)入口,驅(qū)動(dòng)注冊(cè)成功

[root@wbyq code]# modinfo hello_drv.ko  #查看驅(qū)動(dòng)詳細(xì)信息
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 #查看動(dòng)態(tài)安裝的驅(qū)動(dòng)
hello_drv 612 0 - Live 0xbf000000 (O)
[root@wbyq code]# rmmod hello_drv.ko #注銷(xiāo)驅(qū)動(dòng)
[ 5610.635000] 驅(qū)動(dòng)出口,驅(qū)動(dòng)注銷(xiāo)成功

5 編寫(xiě)蜂鳴器驅(qū)動(dòng)

5.1 硬件接口

pYYBAGMoThyAcqAWAAB785gbBRc774.png#pic_center

??蜂鳴接口:BP1 – GPD0_0 高電平驅(qū)動(dòng)。

poYBAGMoTh2ALh5zAAFIVeaUTtI355.png#pic_center

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

pYYBAGMoTh2AHTkFAADx1i9W8rc801.png#pic_center

5.2 蜂鳴器驅(qū)動(dòng)層

?? 1.調(diào)用驅(qū)動(dòng)注冊(cè)和注銷(xiāo)函數(shù),在驅(qū)動(dòng)入口函數(shù)中實(shí)現(xiàn)BEEP硬件接口配置。在驅(qū)動(dòng)出口函數(shù)中完成硬件資源釋放。
?? 2.通調(diào)用雜項(xiàng)設(shè)備驅(qū)動(dòng)框架完成雜項(xiàng)設(shè)備注冊(cè),注冊(cè)成功后在/dev生成beep的設(shè)備節(jié)點(diǎn)。完成應(yīng)用層相關(guān)接口函數(shù)編寫(xiě)。

#include 
#include 
#include 
#include 
#include 
/*驅(qū)動(dòng)初始化*/
unsigned int *GPDO_CON;
unsigned int *GPDO_DAT;
int beep_open(struct inode *inode, struct file *file)/*對(duì)應(yīng)應(yīng)用層open函數(shù)*/
{
	printk("open函數(shù)調(diào)用成功n");
	return 0;
}

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

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

MODULE_LICENSE("GPL");//驅(qū)動(dòng)注冊(cè)協(xié)議
MODULE_AUTHOR("it_ashui");
MODULE_DESCRIPTION("Exynos4 beep Driver");

?? 雜項(xiàng)設(shè)備主設(shè)備為10,次設(shè)備可填值為0~254;當(dāng)次設(shè)備號(hào)填255時(shí)表示有系統(tǒng)分配。

5.3 蜂鳴器應(yīng)用層

?? Linux下一切皆文件,操作設(shè)備就和操作文件一樣。只需要open打開(kāi)設(shè)備、讀寫(xiě)設(shè)備、操作完成關(guān)閉設(shè)備即可。

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

? 在Linux內(nèi)核中,設(shè)備節(jié)點(diǎn)的訪(fǎng)問(wèn)是通過(guò)主設(shè)備+次設(shè)備號(hào)的組合來(lái)完成的,占32位,主設(shè)備號(hào)是20 ~ 31位。次設(shè)備號(hào)是0 ~ 19位。

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1415

    瀏覽量

    41267
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11497

    瀏覽量

    213306
  • 驅(qū)動(dòng)開(kāi)發(fā)

    關(guān)注

    0

    文章

    133

    瀏覽量

    12287
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    自學(xué)買(mǎi)什么開(kāi)發(fā)板比較好,求推薦

    有比較長(zhǎng)的linux基礎(chǔ),也有單片機(jī)的開(kāi)發(fā)經(jīng)驗(yàn)?,F(xiàn)在想自學(xué) arm 和linux驅(qū)動(dòng)開(kāi)發(fā),內(nèi)
    發(fā)表于 05-09 22:05

    【NanoPi2申請(qǐng)】簡(jiǎn)單人臉識(shí)別

    這是很好的發(fā)展方向。我現(xiàn)在正在學(xué)習(xí)linux的一些基本操作,打算做linux驅(qū)動(dòng)開(kāi)發(fā),本來(lái)
    發(fā)表于 12-18 14:37

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā) Linux 設(shè)備驅(qū)動(dòng)的基本概念Linux 設(shè)備
    發(fā)表于 09-10 13:10 ?82次下載
    嵌入式<b class='flag-5'>Linux</b>設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>

    Linux基于I2C協(xié)議的RTC驅(qū)動(dòng)開(kāi)發(fā)

    首先研究了Linux環(huán)境字符設(shè)備驅(qū)動(dòng)程序框架,然后介紹12C協(xié)議,在此基礎(chǔ)上開(kāi)發(fā)基于12C協(xié)議的RTC字符設(shè)備驅(qū)動(dòng)程序。砷于
    發(fā)表于 03-02 16:15 ?48次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>基于I2C協(xié)議的RTC<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>

    嵌入式LinuxARM_DSP通信接口設(shè)計(jì)及驅(qū)動(dòng)開(kāi)發(fā)

    嵌入式LinuxARM_DSP通信接口設(shè)計(jì)及驅(qū)動(dòng)開(kāi)發(fā)
    發(fā)表于 05-19 11:17 ?0次下載

    基于嵌入式LinuxARM_DSP通信接口設(shè)計(jì)及驅(qū)動(dòng)開(kāi)發(fā)

    基于嵌入式LinuxARM_DSP通信接口設(shè)計(jì)及驅(qū)動(dòng)開(kāi)發(fā)
    發(fā)表于 10-19 10:38 ?12次下載
    基于嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>下</b>ARM_DSP通信接口設(shè)計(jì)及<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>

    如何編寫(xiě)Linux Nand Flash驅(qū)動(dòng)

    如何編寫(xiě)Linux Nand Flash驅(qū)動(dòng)
    發(fā)表于 10-30 08:36 ?15次下載
    如何編寫(xiě)<b class='flag-5'>Linux</b> <b class='flag-5'>下</b>Nand Flash<b class='flag-5'>驅(qū)動(dòng)</b>

    基于Linux的LCD驅(qū)動(dòng)程序?qū)崿F(xiàn)

    基于Linux的LCD驅(qū)動(dòng)程序?qū)崿F(xiàn)
    發(fā)表于 10-30 16:45 ?12次下載
    基于<b class='flag-5'>Linux</b><b class='flag-5'>下</b>的LCD<b class='flag-5'>驅(qū)動(dòng)</b>程序?qū)崿F(xiàn)

    LinuxPCI設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)

    PCI是一種廣泛采用的總線(xiàn)標(biāo)準(zhǔn),它提供了許多優(yōu)于其它總線(xiàn)標(biāo)準(zhǔn)(如EISA)的新特性,目前已經(jīng)成為計(jì)算機(jī)系統(tǒng)中應(yīng)用最為廣泛,并且最為通用的總線(xiàn)標(biāo)準(zhǔn)。Linux的內(nèi)核能較好地支持PCI總線(xiàn),本文以Intel 386體系結(jié)構(gòu)為主,探討了在Linux
    發(fā)表于 04-26 17:00 ?1165次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>PCI設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>程序<b class='flag-5'>開(kāi)發(fā)</b>

    ARM11嵌入式系統(tǒng)LinuxLCD的驅(qū)動(dòng)的設(shè)計(jì)

    ARM11嵌入式系統(tǒng)LinuxLCD的驅(qū)動(dòng)的設(shè)計(jì)(嵌入式開(kāi)發(fā)啥意思)-ARM11嵌入式系統(tǒng)Linux
    發(fā)表于 07-30 14:53 ?24次下載
    ARM11嵌入式系統(tǒng)<b class='flag-5'>Linux</b><b class='flag-5'>下</b>LCD的<b class='flag-5'>驅(qū)動(dòng)</b>的設(shè)計(jì)

    嵌入式linux報(bào)警,嵌入式LinuxLED報(bào)警燈驅(qū)動(dòng)設(shè)計(jì)及編程.doc

    設(shè)計(jì)及編程一.實(shí)驗(yàn)?zāi)康睦斫?b class='flag-5'>驅(qū)動(dòng)本質(zhì),掌握嵌入式Linux系統(tǒng)驅(qū)動(dòng)開(kāi)發(fā)相關(guān)知識(shí),包括端口寄存器訪(fǎng)問(wèn)、接口函數(shù)編寫(xiě)、和文件系統(tǒng)掛接、注冊(cè)及相關(guān)
    發(fā)表于 11-01 17:21 ?6次下載
    嵌入式<b class='flag-5'>linux</b>報(bào)警,嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>下</b>LED報(bào)警燈<b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)及編程.doc

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解
    發(fā)表于 10-28 11:03 ?54次下載

    如何驅(qū)動(dòng)Linux開(kāi)發(fā)板LED燈

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

    如何學(xué)習(xí)Linux驅(qū)動(dòng)開(kāi)發(fā)

    困惑,面對(duì)復(fù)雜的Linux內(nèi)核有一種無(wú)從下手的感覺(jué)。今天就和大家分享一,讓剛剛步入驅(qū)動(dòng)開(kāi)發(fā)的同學(xué)少走一些彎路。01要知道將來(lái)要做什么學(xué)習(xí),都是有目的性的,要么是興
    的頭像 發(fā)表于 01-06 16:34 ?1205次閱讀
    如何學(xué)習(xí)<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>?

    Linux 驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā),你知道多少?

    一、Linux驅(qū)動(dòng)開(kāi)發(fā)與應(yīng)用開(kāi)發(fā)的區(qū)別開(kāi)發(fā)層次不同:Linux
    的頭像 發(fā)表于 08-30 12:16 ?1548次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>與應(yīng)用<b class='flag-5'>開(kāi)發(fā)</b>,你知道多少?