娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

驅(qū)動程序?qū)嵗ㄈ悍澍Q器驅(qū)動程序(misc類設(shè)備驅(qū)動框架)

發(fā)布者:Zhenai5201314最新更新時間:2025-01-16 來源: cnblogs關(guān)鍵字:驅(qū)動程序  蜂鳴器  misc類設(shè)備  驅(qū)動框架 手機看文章 掃描二維碼
隨時隨地手機看文章

正文

結(jié)合之前對Linux內(nèi)核的misc類設(shè)備驅(qū)動框架的分析 ,本文將編寫基于misc類設(shè)備驅(qū)動框架的Buzzer設(shè)備的實例代碼并對其進行分析。


misc類設(shè)備驅(qū)動框架的分析,詳見Linux字符設(shè)備驅(qū)動框架(三):Linux內(nèi)核的misc類設(shè)備驅(qū)動框架。

硬件接口:

  CPU:s5pv210;

  Buzzer的GPIO:GPIO_D0_2 ;

  LED的工作方式:低電平停,高電平響。

P.S.:無源蜂鳴器聲音頻率可控,一般采用PWM控制;有源蜂鳴器用普通IO控制方式即可。


1. 驅(qū)動程序分析

本代碼取自,九鼎科技x210開發(fā)板的BSP。


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#define DEVICE_NAME     'buzzer'


#define PWM_IOCTL_SET_FREQ        1

#define PWM_IOCTL_STOP            0


static struct semaphore lock;


// TCFG0在Uboot中設(shè)置,這里不再重復(fù)設(shè)置

// Timer0輸入頻率Finput=pclk/(prescaler1+1)/MUX1

//                     =66M/16/16

// TCFG0 = tcnt = (pclk/16/16)/freq;

// PWM0輸出頻率Foutput =Finput/TCFG0= freq

static void PWM_Set_Freq( unsigned long freq )

{

    unsigned long tcon;

    unsigned long tcnt;

    unsigned long tcfg1;


    struct clk *clk_p;

    unsigned long pclk;

    

    //設(shè)置GPD0_2為PWM輸出

    s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(2));


    tcon = __raw_readl(S3C2410_TCON);

    tcfg1 = __raw_readl(S3C2410_TCFG1);


    //mux = 1/16

    tcfg1 &= ~(0xf<<8);

    tcfg1 |= (0x4<<8);

    __raw_writel(tcfg1, S3C2410_TCFG1);

    

    clk_p = clk_get(NULL, 'pclk');

    pclk  = clk_get_rate(clk_p);


    tcnt  = (pclk/16/16)/freq;

    

    __raw_writel(tcnt, S3C2410_TCNTB(2));

    __raw_writel(tcnt/2, S3C2410_TCMPB(2));//占空比為50%


    tcon &= ~(0xf<<12);

    tcon |= (0xb<<12);        //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0

    __raw_writel(tcon, S3C2410_TCON);

    

    tcon &= ~(2<<12);         //clear manual update bit

    __raw_writel(tcon, S3C2410_TCON);

}


void PWM_Stop( void )

{

    //將GPD0_2設(shè)置為input

    s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(0));    

}


static int x210_pwm_open(struct inode *inode, struct file *file)

{

    if (!down_trylock(&lock))//上鎖

        return 0;

    else

        return -EBUSY;

    

}


static int x210_pwm_close(struct inode *inode, struct file *file)

{

    up(&lock);//解鎖

    return 0;

}


// PWM:GPF14->PWM0

static int x210_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

{

    switch (cmd) 

    {

        case PWM_IOCTL_SET_FREQ:

            printk('PWM_IOCTL_SET_FREQ:rn');

            if (arg == 0)

                return -EINVAL;

            PWM_Set_Freq(arg);

            break;


        case PWM_IOCTL_STOP:

        default:

            printk('PWM_IOCTL_STOP:rn');

            PWM_Stop();

            break;

    }

    return 0;

}


//buzzer設(shè)備操作集

static struct file_operations dev_fops = {

    .owner   =   THIS_MODULE,

    .open    =   x210_pwm_open,

    .release =   x210_pwm_close, 

    .ioctl   =   x210_pwm_ioctl,

};


//misc類設(shè)備信息初始化

static struct miscdevice misc = 

{

    .minor = MISC_DYNAMIC_MINOR,

    .name = DEVICE_NAME,

    .fops = &dev_fops,

};


//buzzer設(shè)備注冊

static int __init dev_init(void)

{

    int ret;


    init_MUTEX(&lock);           //上鎖

    ret = misc_register(&misc);  //將buzzer注冊到misc類下

    

    /* GPD0_2 (PWMTOUT2) */

    ret =

 gpio_request(S5PV210_GPD0(2), 'GPD0');        //申請GPIO

    if(ret)

        printk('buzzer-x210: request gpio GPD0(2) fail');

        

    s3c_gpio_setpull(S5PV210_GPD0(2), S3C_GPIO_PULL_UP);//將GPIO_D0_2設(shè)置為上拉

    s3c_gpio_cfgpin(S5PV210_GPD0(2), S3C_GPIO_SFN(1));  //將GPIO_D0_2設(shè)置為輸出模式

    gpio_set_value(S5PV210_GPD0(2), 0);                 //將GPIO_D0_2設(shè)置為低電平


    printk ('x210 'DEVICE_NAME' initializedn');

        return ret;

}


//buzzer設(shè)備注銷

static void __exit dev_exit(void)

{

    init_MUTEX_LOCKED(&lock);  //解鎖

    gpio_free(S5PV210_GPD0(2));//釋放GPIO

    misc_deregister(&misc);    //注銷buzzer設(shè)備

}


module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE('GPL');

MODULE_AUTHOR('www.9tripod.com');

MODULE_DESCRIPTION('x210 PWM Driver');


2.測試

Buzzer驅(qū)動模塊被裝載進內(nèi)核之后,可運行如下應(yīng)用程序測試該驅(qū)動是否工作正常。若運行應(yīng)用程序之后,蜂鳴器連響3聲,則說明驅(qū)動工作正常。


#include

#include

#include

#include

#include


#define FILE_BUZZER '/dev/buzzer'


#define PWM_IOCTL_SET_FREQ        1

#define PWM_IOCTL_STOP            0


int main(void)

{

    int fd = -1;

    int i = 0;

    

    fd = open(FILE_BUZZER, O_RDWR);

    if (fd < 0)

    {

        printf('open buzzer file error.n');

        return -1;

    }

    

    for (i=0; i<3; i++)

    {

        ioctl(fd, PWM_IOCTL_SET_FREQ, 10000);

        sleep(3);

        ioctl(fd, PWM_IOCTL_STOP);

        sleep(3);

    }

    

    return 0;

}


關(guān)鍵字:驅(qū)動程序  蜂鳴器  misc類設(shè)備  驅(qū)動框架 引用地址:驅(qū)動程序?qū)嵗ㄈ悍澍Q器驅(qū)動程序(misc類設(shè)備驅(qū)動框架)

上一篇:Linux內(nèi)核靜態(tài)映射表的建立過程
下一篇:驅(qū)動程序?qū)嵗ㄎ澹篖CD驅(qū)動程序分析(Samsung LCD)

推薦閱讀最新更新時間:2025-06-05 04:47

CT107D藍橋杯蜂鳴器和繼電器(2)
今天我給大家講一下這塊板子的蜂鳴器和繼電器 1,——蜂鳴器 先找圖,蜂鳴器叫做buzz 然后看到是N BUZZ口控制,繼續(xù)找 找到這里我們可以知道蜂鳴器是用U9這個鎖存器控制的Q7為0蜂鳴器工作,那么我們繼續(xù)找U9的控制口Y5C 看到這個是不是很熟悉呢,沒錯和LED很想是吧,好我們繼續(xù)找Y5 好了,沒錯又是這個138芯片,和LED的一樣。 原理我這里就不再啰嗦了,我直接上代碼了 P2=(P2&0x1f)|0xa0; 這個就是打開Y5口 P0=0x40 打開蜂鳴器 P0&=0xb0 關(guān)閉蜂鳴器 P2&=0x1f 關(guān)閉Y5口 2 ——繼電器的使用
[單片機]
CT107D藍橋杯<font color='red'>蜂鳴器</font>和繼電器(2)
51單片機 使用蜂鳴器播放簡單音樂
MCU型號 STC 89C52RC #include reg52.h #define RldTmr(fr) 65536 - (11059200 / 12) / (fr 1) #define FuDian(n) (n 1) / 3 //附點n分音符的換算 typedef unsigned char UCHAR; typedef unsigned int UINT; typedef unsigned long ULONG; sbit BUZZ = P1^6; UINT code noteFreq = { //中音 1-7 和高音 1-7對應(yīng)的頻率列表 523, 587
[單片機]
11. GPIO原理與配置(跑馬燈,蜂鳴器,按鍵)
一。STM32 GPIO固件庫函數(shù)配置方法 1. 根據(jù)需要在項目中刪掉一些不用的固件庫文件,保留有用的固件庫文件 2. 在stm32f10x_conf.h中注釋掉這些不用的頭文件 3. STM32的IO口可以由軟件配置成如下8種模式(4種輸入模式,4種輸出模式) 分別在CRL寄存器和CRH寄存器中配置,配置每一個IO口需要4位來配置 2位MODE位----配置是輸入模式還是輸出模式 2位CNF位---根據(jù)MODE位的配置來確定是哪種輸入模式或輸出模式 a。輸入浮空 b。輸入上拉 c。輸入下拉 d。模擬輸入 e。開漏輸出 f。推挽輸出 g。推挽式復(fù)用功能 h。開漏復(fù)用功能 配置函數(shù) void GPIO_Init(GPIO
[單片機]
11. GPIO原理與配置(跑馬燈,<font color='red'>蜂鳴器</font>,按鍵)
使用單片機驅(qū)動蜂鳴器產(chǎn)生警報聲
//************************************************** //實驗?zāi)康模?//熟悉使用單片機驅(qū)動蜂鳴器產(chǎn)生警報聲 //************************************************** //************************************************** //硬件設(shè)置: //1、硬件不需設(shè)置 //************************************************** //************************************************** //***
[單片機]
專題8-I2C驅(qū)動程序設(shè)計-第3課-I2C子系統(tǒng)
1、概述 (1)I2C子系統(tǒng)架構(gòu) (2)I2C總線驅(qū)動 2、子系統(tǒng)架構(gòu)
[單片機]
專題8-I2C<font color='red'>驅(qū)動程序</font>設(shè)計-第3課-I2C子系統(tǒng)
LCD驅(qū)動程序(二)
上節(jié)我們主要是對fb_info結(jié)構(gòu)體的配置,對fb_info結(jié)構(gòu)體的配置主要分為一下步驟: static int lcd_init(void) { /* 1. 分配一個fb_info */ s3c_lcd = framebuffer_alloc(0, NULL); /* 2. 設(shè)置 */ /* 2.1 設(shè)置固定的參數(shù) */ /* 2.2 設(shè)置可變的參數(shù) */ /* 2.3 設(shè)置操作函數(shù) */ /* 2.4 其他的設(shè)置 */ /* 3. 硬件相關(guān)的操作 */ /* 3.1 配置GPIO用于LCD */ /* 3.2 根據(jù)LCD手冊設(shè)置LCD控制器, 比如VCLK的頻率等 */ /* 3.3 分配顯存(framebuffer), 并把
[單片機]
LCD<font color='red'>驅(qū)動程序</font>(二)
單片機+L298直流電機驅(qū)動程序
直流電機驅(qū)動系統(tǒng) 設(shè)計一個直流電機驅(qū)動電路,要求: (1) 采用MOS管,H橋,或者集成驅(qū)動芯片構(gòu)成直流電機的驅(qū)動電路 (2) 采用單片機輸出可調(diào)PWM控制電機速度 #include reg51.h #define uchar unsigned char #define uint unsigned int sbit in1=P2^2; sbit in2=P2^3; uchar duty,i; void main() { TMOD=0x02; TH0=156; TL0=156; EA=1; EX1=1; EX0=1; ET0=1; TR0=1; I
[單片機]
單片機+L298直流電機<font color='red'>驅(qū)動程序</font>
51單片機DS1302實時時鐘驅(qū)動程序
DS1302是低功耗實時時鐘芯片,它可以對年、月、日、周、時、分、秒進行計時,且具有閏年補償?shù)榷喾N功能。主要特點是采用串行數(shù)據(jù)傳輸,可為掉電保護電源提供可編程的充電功能,并且可以關(guān)閉充電功能。 一.基本原理 1.引腳分析 2.時序分析 (1)寫字節(jié) 第一個字節(jié)是地址字節(jié),第二個字節(jié)是數(shù)據(jù)字節(jié)。RST信號必須拉高,否則數(shù)據(jù)的輸入是無效的。換一句話說,RST信號控制數(shù)據(jù)|時間信號輸入的開始和結(jié)束。地址字節(jié)和數(shù)據(jù)字節(jié)的讀取時上升沿有效,而且是由LSB開始讀入。 (2)讀字節(jié) 讀一個字節(jié)和寫一個字節(jié)有明顯的不一樣,先是寫地址字節(jié),然后再讀數(shù)據(jù)字節(jié),寫地址字節(jié)時上升沿有效,而讀數(shù)據(jù)字節(jié)時下降沿有效,當(dāng)然前提是RST信號必須拉高
[單片機]
51單片機DS1302實時時鐘<font color='red'>驅(qū)動程序</font>
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 通辽市| 开原市| 乐东| 岢岚县| 松潘县| 祥云县| 南涧| 三穗县| 承德县| 洪泽县| 北海市| 平江县| 时尚| 离岛区| 连城县| 金秀| 忻州市| 重庆市| 闽侯县| 大厂| 南阳市| 闻喜县| 武山县| 闽清县| 昌宁县| 永城市| 延安市| 法库县| 托克逊县| 隆安县| 故城县| 巨野县| 五华县| 合山市| 璧山县| 裕民县| 蓬莱市| 金溪县| 穆棱市| 九龙县| 安新县|