linux中pwm设备在哪里,向linux内核中加载PWM(蜂鸣器)的两种方法

pwm_test蜂鸣器驱动的添加

添加有两种方式

Pwm驱动程序:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define DEVICE_NAME     "pwm"

#define PWM_IOCTL_SET_FREQ             1

#define PWM_IOCTL_STOP                     0

static struct semaphore lock;

/* freq:  pclk/50/16/65536 ~ pclk/50/16

* if pclk = 50MHz, freq is 1Hz to 62500Hz

* human ear : 20Hz~ 20000Hz

*/

static void PWM_Set_Freq( unsigned long freq )

{

unsigned long tcon;

unsigned long tcnt;

unsigned long tcfg1;

unsigned long tcfg0;

struct clk *clk_p;

unsigned long pclk;

//set GPB0 as tout0, pwm output

s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);

tcon = __raw_readl(S3C2410_TCON);

tcfg1 = __raw_readl(S3C2410_TCFG1);

tcfg0 = __raw_readl(S3C2410_TCFG0);

//prescaler = 50

tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;

tcfg0 |= (50 - 1);

//mux = 1/16

tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;

tcfg1 |= S3C2410_TCFG1_MUX0_DIV16;

__raw_writel(tcfg1, S3C2410_TCFG1);

__raw_writel(tcfg0, S3C2410_TCFG0);

clk_p = clk_get(NULL, "pclk");

pclk  = clk_get_rate(clk_p);

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

__raw_writel(tcnt, S3C2410_TCNTB(0));

__raw_writel(tcnt/2, S3C2410_TCMPB(0));

tcon &= ~0x1f;

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

__raw_writel(tcon, S3C2410_TCON);

tcon &= ~2;                 //clear manual update bit

__raw_writel(tcon, S3C2410_TCON);

}

static void PWM_Stop(void)

{

s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPIO_OUTPUT);

s3c2410_gpio_setpin(S3C2410_GPB(0), 0);

}

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

{

if (!down_trylock(&lock))

return 0;

else

return -EBUSY;

}

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

{

PWM_Stop();

up(&lock);

return 0;

}

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

{

//printk("ioctl pwm: %x %lx\n", cmd, arg);

switch (cmd) {

case PWM_IOCTL_SET_FREQ:

if (arg == 0)

return -EINVAL;

PWM_Set_Freq(arg);

break;

case PWM_IOCTL_STOP:

PWM_Stop();

break;

}

return 0;

}

static struct file_operations dev_fops = {

.owner   =   THIS_MODULE,

.open    =   s3c24xx_pwm_open,

.release =   s3c24xx_pwm_close,

.ioctl   =   s3c24xx_pwm_ioctl,

};

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &dev_fops,

};

static int __init dev_init(void)

{

int ret;

init_MUTEX(&lock);

ret = misc_register(&misc);

printk (DEVICE_NAME"\tinitialized\n");

return ret;

}

static void __exit dev_exit(void)

{

misc_deregister(&misc);

}

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("FriendlyARM Inc.");

MODULE_DESCRIPTION("S3C2410/S3C2440 PWM Driver");

1.       直接添加在内核中

①     mini2440_pwm.c驱动程序拷贝到字符设备驱动下

cp mini2440_pwm.c /usr/local/kernels/linux-2.6.32.2/drivers/char/

②     在/usr/local/kernels/linux-2.6.32.2/drivers/char/下修改配置文件Kconfig

加入

config PWM

tristate "This is PWM Driver"

default y

---help---

pwm!pwm!

③     在/usr/local/kernels/linux-2.6.32.2/drivers/char/下Makefile中

加入

obj-$(CONFIG_PWM)   +=mini2440_pwm.o

④     make menuconfig中选中pwm选项

Dvice drivers----à

Charcter drivers-----à

[*]This is PWM Driver

⑤     make zImage

⑥     把linux-2.6.32.2/ARCH/arm/boot/zImage拷贝到板子上去

⑦     在终端中运行pwm_test即可听到蜂鸣器发出声音

2.       以模块的方式添加

①     前三步骤和直接加载到内核的一样

②     make menuconfig中选中pwm选项

Dvice drivers----à

Charcter drivers-----à

[M]This is PWM Driver

③     先将Driver文件夹中有Makefile文件执行make

④     将mini2440_pwm.ko移动mv mini2440_pwm.ko lib/modules/

⑤     加载至内核insmod  mini2440_pwm.ko

⑥     用lsmod可以查看已经加载过的驱动

⑦     再回到应用程序中make一下

执行pwm_test

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: exynos4412-pwm 蜂鸣器开发是指使用Exynos4412芯片的PWM模块来控制蜂鸣器的开发。PWM模块可以产生一定频率和占空比的脉冲信号,通过控制脉冲信号的频率和占空比,可以控制蜂鸣器发出不同的声音。在开发过程,需要了解Exynos4412芯片的PWM模块的使用方法,以及蜂鸣器的工作原理和控制方式。同时,还需要编写相应的驱动程序和应用程序,实现蜂鸣器的控制。 ### 回答2: exynos4412-pwm蜂鸣器开发是指在使用exynos4412芯片的板子上使用pwm技术来控制蜂鸣器发出声音。该方案的实现需要一些必要的硬件和软件条件。 首先,需要准备一款带有蜂鸣器的arduino或类似的板子,同时还需要exynos4412芯片的板子,以及一些杜邦线和电阻等电子元器件。其次,需要在板子上安装linux操作系统,并配置好相关的驱动程序和开发环境。在这个过程需要熟悉linux内核驱动开发和用户空间开发,同时还需要掌握pwm技术和蜂鸣器的原理。 在完成硬件和软件准备后,可以开始进行exynos4412-pwm蜂鸣器开发。首先创建一个设备驱动程序来控制蜂鸣器,并在其实现pwm技术来生成不同频率的蜂鸣器声音。然后可以在应用程序调用这个驱动程序来实现具体的功能,比如根据输入的命令生成不同的蜂鸣器声音。 总的来说,exynos4412-pwm蜂鸣器开发需要掌握一定的硬件和软件技能,包括linux开发、驱动程序开发、pwm技术和蜂鸣器原理等。在掌握了这些技能后,可以很方便地在exynos4412芯片的板子上实现蜂鸣器声音的控制和应用。 ### 回答3: exynos4412-pwm是一种嵌入式系统的PWM控制器,它能够对某些外设进行精准控制。而蜂鸣器则是常用的一种简单外设,能够通过PWM信号控制而发出声音。因此,我们可以结合exynos4412-pwm的特性,来进行蜂鸣器的开发。 首先,我们需要确定使用的蜂鸣器的型号和规格,以及它的工作电压和最大工作频率。根据这些参数,我们就可以计算出需要给PWM控制器发送的频率和占空比等参数。在编码实现上,我们可以通过Linux操作系统的sysfs文件系统对PWM控制器进行设置和控制。具体而言,我们需要修改/sys/devices/platform/pwm-ctrl/目录下的相关文件来设置频率和占空比等属性,以及控制PWM输出信号的开关状态。 此外,在硬件设计上,我们还需要将蜂鸣器接入到exynos4412-pwm控制器的PWM输出信号。需要注意的是,蜂鸣器的极性也需要正确接入,以确保PWM正负半周的输出方向正确。 综上所述,exynos4412-pwm蜂鸣器开发需要我们在硬件和软件两个方面进行开发和实现。在硬件方面,需要正确接入蜂鸣器PWM控制器,并确保信号方向和极性正确;在软件方面,需要通过Linux操作系统的sysfs文件系统对PWM控制器进行设置和控制。通过这样的方式,我们就可以很方便地实现蜂鸣器的声音输出,以满足一些嵌入式系统的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值