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

S5PV210 Linux字符驅動之PWM蜂鳴器驅動

發布者:心有歸屬最新更新時間:2024-12-18 來源: cnblogs關鍵字:S5PV210  Linux  字符驅動  PWM  蜂鳴器驅動 手機看文章 掃描二維碼
隨時隨地手機看文章

在SMDK210.C中添加如下beeper_device 結構體

static struct platform_device beeper_device = {
.name = 'pwm_buzzer',
.id         =  1,
.dev = {
.parent = &s3c_device_timer[1].dev, //PWM1是定時器1
.platform_data= 0,
},
};

然后在smdkv210_devices中添加該結構體

static struct platform_device *smdkv210_devices[] __initdata = {
&s3c_device_fb,
&s3c_device_adc,
&s3c_device_cfcon,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_hsmmc2,
&s3c_device_hsmmc3,
&s3c_device_i2c0,
&s3c_device_i2c1,
&s3c_device_i2c2,

&s3c_device_timer[1], //add
&beeper_device, //add

}

一、硬件分析
對蜂鳴器的操作,主要是通過S5PV210的PWM來實現的,因為在OK210上,連接的是一個無源蜂鳴器,必須通過外部的驅動信號,才能控制其的“鳴叫”。
首先從OK210的底板原理圖中可知,OK210開發板上的蜂鳴器連接通過一個三極管組成的放大電路連接到了核心板的XpwmTOUT[1]引腳上,如下圖所示:


而XpwmTOUT[1]引腳由S5PV210用戶手冊,可知,該引腳位于GPD0[1]引腳上,默認為GPI,即當作通用輸入端口使用,如下圖所示:

 

但的第一功能名為TOUT_0,繼續查閱,可知,該功能可作為PWM輸出使用,如下所示,

 


所以,我們要對蜂鳴器進行操作,就是通過對XpwmTOUT[1]引腳的設置,即將其設置為TOUT_0功能,通過配置PWM的波形來實現蜂鳴器的鳴叫。
二、軟件基礎
如上所述,無源蜂鳴器沒有自帶震蕩電路,必須外部提供2-5Khz左右的方波,才能驅動其發聲,而要想產生方波,就會用到S5PV210的PWM模塊。
S5PV210共有5個32bit的PWM定時器,其中定時器0、1、2、3有PWM功能,定時器4沒有輸出引腳。這些定時器都可產生中斷。每個定時器可選擇輸入時鐘為PCLK或SCLK_PWM。對PWM的操作,主要通過幾個寄存器來完成,操作步驟如下:
1、設置TCFG0寄存器:配置定時器的一級分頻值
2、設置TCFG1寄存器:配置定時器的二級分頻值
3、設置TCNTBn寄存器:遞減計數器緩沖寄存器
4、設置TCMPBn寄存器:比較緩沖寄存器
5、設置TCON寄存器:
(1)手動更新on(執行后,CPU會把TCNTBn的值加載到遞減計數器中)
(2)手動更新off、自動重載、啟動定時器
不過在Linux內核中,三星公司和飛凌公司已經為我們配置好了對這些PWM模塊的使用,具體參見源碼目錄下 arch/arm/plat-s3c/的pwm.c文件,在驅動編程中,主要使用pwm_config()、pwm_enable()、pwm_disable(pwm4buzzer)這三個函數。另外,也可參見另一篇博文【S5PV210 PWM】。
三 驅動編程
有圖有真相,按照如下運行后,即可聽到“鳴叫”。

1 驅動程序


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#define DEVICE_NAME                                'pwm_buzzer'

#define PWM_IOCTL_SET_FREQ                1

#define PWM_IOCTL_STOP                        0

#define NS_IN_1HZ                                (1000000000UL)

#define BUZZER_PWM_ID                        0

#define BUZZER_PMW_GPIO                        S5PV210_GPD0(0)


static struct pwm_device *pwm4buzzer;

static struct semaphore lock;


static void pwm_set_freq(unsigned long freq) {

        int period_ns = NS_IN_1HZ / freq;

        pwm_config(pwm4buzzer, period_ns / 2, period_ns);

        pwm_enable(pwm4buzzer);

}


static void pwm_stop(void) {

        pwm_config(pwm4buzzer, 0, NS_IN_1HZ / 100);

        pwm_disable(pwm4buzzer);

}



static int my_pwm_open(struct inode *inode, struct file *file) {

    if (!down_trylock(&lock))

         return 0;

        else

       return -EBUSY;

}


static int my_pwm_close(struct inode *inode, struct file *file) {

        up(&lock);

        return 0;

}


static long my_pwm_ioctl(struct file *filep, unsigned int cmd,unsigned long arg)

{

        switch (cmd) {

                case PWM_IOCTL_SET_FREQ:

                        if (arg == 0)

                                return -EINVAL;

                        pwm_set_freq(arg);

                        break;


                case PWM_IOCTL_STOP:

                default:

                        pwm_stop();

                        break;

        }


        return 0;

}



static struct file_operations my_pwm_ops = {

        .owner                        = THIS_MODULE,

        .open                        = my_pwm_open,

        .release                = my_pwm_close,

        .unlocked_ioctl        = my_pwm_ioctl,

};


static struct miscdevice my_misc_dev = {

        .minor = MISC_DYNAMIC_MINOR,

        .name = DEVICE_NAME,

        .fops = &my_pwm_ops,

};


static int __init my_pwm_dev_init(void) {

        int ret;

    printk(DEVICE_NAME ' my_pwm_dev_initn');

        ret = gpio_request(BUZZER_PMW_GPIO, DEVICE_NAME);

        if (ret) {

                printk('request GPIO %d for pwm failedn', BUZZER_PMW_GPIO);

                return ret;

        }


        gpio_set_value(BUZZER_PMW_GPIO, 0);

        s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_OUTPUT);

        pwm4buzzer = pwm_request(BUZZER_PWM_ID, DEVICE_NAME);

        if (IS_ERR(pwm4buzzer)) {

                printk('request pwm %d for %s failedn', BUZZER_PWM_ID, DEVICE_NAME);

                return -ENODEV;

        }


        pwm_stop();

        s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_SFN(2));

        gpio_free(BUZZER_PMW_GPIO);

        init_MUTEX(&lock);

        ret = misc_register(&my_misc_dev);

        return ret;

}


static void __exit my_pwm_dev_exit(void) {

    printk(DEVICE_NAME ' my_pwm_dev_exitn');

        pwm_stop();

        misc_deregister(&my_misc_dev);

}


module_init(my_pwm_dev_init);

module_exit(my_pwm_dev_exit);


MODULE_LICENSE('GPL');

MODULE_AUTHOR('gjianw217@163.com');

MODULE_DESCRIPTION('PWM Driver');


2 應用程序


#include

#include

#include

#include

#include

#include

#include

#define PWM_IOCTL_SET_FREQ 1

#define PWM_IOCTL_STOP 0


int main(int argc ,char* argv[])

{

   int m_fd=0;//

   m_fd = open('/dev/pwm', O_RDONLY);

   int freq=1000;

   if(argc>1)

   freq=atoi(argv[1]);

   printf('%d tt',freq);

   ioctl(m_fd, PWM_IOCTL_STOP);

   ioctl(m_fd, PWM_IOCTL_SET_FREQ,freq);

   getchar();

   ioctl(m_fd, PWM_IOCTL_STOP);

   close(m_fd);

   return 0;

}


3 Makefile文件


#pwm Makefile

ARCH=arm

CROSS_COMPILE=/home/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-

APP_COMPILE=/home/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-

#obj-m := app-drv.o

obj-m := pwm-drv.o

#KDIR := /path/to/kernel/linux/

KDIR := /home/ok210/android-kernel-samsung-dev/

PWD := $(shell pwd)

default:

        make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules

app:pwm-app.c

        $(APP_COMPILE)gcc -o app pwm-app.c

clean:

        $(MAKE) -C $(KDIR) M=$(PWD) clean


關鍵字:S5PV210  Linux  字符驅動  PWM  蜂鳴器驅動 引用地址:S5PV210 Linux字符驅動之PWM蜂鳴器驅動

上一篇:S5PV210之UBOOT-2011.06啟動過程解析
下一篇:MPlayer在ARM上的移植(S5PV210開發板)

推薦閱讀最新更新時間:2025-06-08 12:35

S5PV210版本NDT嵌入式Linux主機目錄分布及開發流程簡要說明
開發才用win10宿主機+VMWare12.5+Ubuntu14.04 LTS虛擬機環境。 1、文件目錄介紹 開發機器所建用戶名為administrator,機器密碼為******。 嵌入式QT目錄:/home/administrator/linuxtools/armqt/ tftp共享目錄:/home/administrator/tftp 根文件系統: /home/administrator/rootfs 內核目錄: /home/administrator/kernel/linux-2.6.35.7 工程目錄: /home/administrator/NDT-2015/NDT-F 2、
[單片機]
S5PV210Linux下如何編寫中斷驅動
我使用了兩種驅動開發的模型來寫了smart210上的按鍵驅動程序,這里做一下總結以及提供他人參考以及建議和改進,最后一個原因是自己很久沒有寫過博客了,現在想分享一下linux驅動開發程序的編寫。 首先是Linux的中斷處理機制。裸機開發中,通過中斷標識一個函數指明該函數是中斷處理函數,在編譯器處理時候,也會對該函數的指針保存或特殊處理,當把該程序燒寫到板子的時候,會把這個中斷函數的地址加載到指定的地址,當中斷發生時,通過寄存器保存的該函數的指針,進行中斷函數地處理。但是在Linux中采用了類似信號處理這一種機制,在Linux的底層,當有中斷發生時,就會有板級的代碼產生一個指定的中斷號,我們的中斷驅動就是在內核中注冊當接收的該中
[單片機]
51單片機 驅動蜂鳴器、繼電器實驗
//==聲明區======================================== #include // 定義8051暫存器之標頭檔, P2-17~19 sbit buzzer = P3^7; // 聲明蜂鳴器的位置 sbit relay = P3^6; // 聲明繼電器的位置 void delay(int); // 聲明延遲函數 void pulse_BZ(int,int,int); // 聲明蜂鳴器發聲函數 void pulse_RL(int,int,int); // 聲明繼電器控制函數 //==主程序==========
[單片機]
字符設備驅動(1)代碼分析---之gpio_get_value
在中斷處理函數中,調用gpio_get_value/gpio_set_value()函數來獲取/設置gpio端口的值,在這里簡單分析一下內核的實現流程。 tmp = gpio_get_value(S5PV210_GPH2(0)); #define gpio_get_value __gpio_get_value int __gpio_get_value(unsigned gpio) { struct gpio_chip *chip; int value; chip = gpio_to_chip(gpio); ## { .base = (S5P_VA_GPIO + 0xC40),
[單片機]
偉迪捷新型小字符噴碼機驅動提升 日常運營績效
新型 Videojet 1580 小字符 (CIJ) 噴碼機通過評估和改進噴碼機性能,提供輕松的標識和噴碼體驗,延長正常運行時間,并降低總體擁有成本 (TCO) ? 芝加哥——2018 年 8 月 29 日—— 偉迪捷 在小字符噴碼領域擁有超過 40 年的經驗,很高興推出新型 Videojet 1580 CIJ 噴碼機。Videojet 1580 的設計重點在于提供輕松的標識和噴碼體驗,在日常操作中提供持久的正常運行時間,同時盡可能減少操作失誤并降低總體擁有成本 (TCO)。 ? Videojet 1580 將繼續提供高質量噴碼,同時盡可能減少操作員干預,了解到這一點,制造商可專注于持續運行生產線這一主要任務。新型 Videoje
[嵌入式]
QT開發之移植qt5.6.2到S5PV210
1、移植前的準備工作  (1)確認已經燒錄uboot,并設置環境變量bootcmd和bootargs從tftp、nfs啟動;  (2)zImage事先編譯好的,文件夾形式的rootfs準備好,成功啟動內核進入命令行;  (3)ts驅動源碼確認添加、設備文件確認OK(dev/input/event2)(cat dev/input/event2 點擊觸摸屏有亂碼打印出來); 2、tslib移植和測試  (1)源碼下載  (2)解壓 tar -xvf tslib-1.4.tar.gz  (3)配置 cd tslib ./autogen.sh echo ac_cv_func_malloc_0_nonn
[單片機]
S5PV210開發系列四_uCGUI的移植
GUI(圖形用戶界面)極大地方便了非專業用戶的使用,用戶無需記憶大量的命令,取而代之的是能夠通過窗體、菜單、按鍵等方式進行操作。 在某些場合,設計一款人機界面豐富友好的嵌入式產品能贏得很多其它的用戶。筆者此處就S5PV210基于uCGUI圖形用戶界面的使用作一個簡單的介紹。 1. uCGUI移植概述 1.1. S5PV210 Bootloader 筆者的S5PV210的Bootloader設置最高的CPU主頻1GHZ,MMU進行1:1內存空間線性映射,并開啟L1 I/D Cache、L2 Cache、硬件分支預測功能,使CPU能達到最大的吞吐量性能。初始化內存,可以識別sd/mmc啟動和Nand flash啟動,自己主動載入應用代
[單片機]
<font color='red'>S5PV210</font>開發系列四_uCGUI的移植
S5PV210開發 -- 開發板配置
硬件電路設計部分其實本該現在講的,但是一來時間有限,二來后面項目開發時會涉及。所以現在只簡單的看一下。 硬件參數:
[單片機]
<font color='red'>S5PV210</font>開發 -- 開發板配置
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 水富县| 通化县| 湘潭县| 商水县| 襄樊市| 无锡市| 石屏县| 江孜县| 鱼台县| 石家庄市| 湘潭市| 家居| 曲阳县| 安溪县| 抚顺县| 三江| 鱼台县| 甘谷县| 高安市| 平邑县| 桃园市| 华宁县| 德格县| 西平县| 泗洪县| 阿拉善盟| 西青区| 镇巴县| 汉川市| 嘉定区| 阳原县| 云安县| 鄂伦春自治旗| 双城市| 隆化县| 电白县| 淳安县| 冕宁县| 象山县| 历史| 荆门市|