看代码注释_tmp &= ~(1<<14)_6410 pwm0驱动修改说明

本文详细介绍了如何为S3C6410平台实现一个蜂鸣器驱动程序,包括初始化GPIO配置、设置蜂鸣器开/关状态以及通过ioctl接口进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <plat/regs-timer.h>
#include <mach/regs-irq.h>
#include <asm/mach/time.h>
#include <linux/clk.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/miscdevice.h>

#include <mach/map.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>

#include <plat/gpio-cfg.h>
#include <mach/gpio-bank-e.h>
#include <mach/gpio-bank-f.h>
#include <mach/gpio-bank-k.h>

#define DEVICE_NAME     "buzzer"

#define BUZZER_IOCTL_SET_ON _IOW('Q', 0x1, int)
#define BUZZER_IOCTL_SET_OFF _IOW('Q', 0x0, int)

static void buzzer_set_on()
{
 unsigned tmp;
 tmp = readl(S3C64XX_GPFDAT);
 tmp |= 1<<14;                     //gpf14 set high level
 writel(tmp, S3C64XX_GPFDAT);

}

static void buzzer_set_off()
{
 unsigned tmp;
 
 tmp = readl(S3C64XX_GPFDAT);
 tmp &= ~(1<<14);                  //gpf14 set low level
 writel(tmp, S3C64XX_GPFDAT);

}

 

static long s3c64xx_buzzer_ioctl(struct file *filep, unsigned int cmd, long arg)
{
 switch (cmd) {
  case BUZZER_IOCTL_SET_ON:
   buzzer_set_on();
   break;
  case BUZZER_IOCTL_SET_OFF:
   buzzer_set_off();
   break;
  default:
   break;
 }
 return 0;
}


static struct file_operations dev_fops = {
    .owner   = THIS_MODULE,
    .unlocked_ioctl = s3c64xx_buzzer_ioctl,
};

static struct miscdevice misc = {
 .minor = MISC_DYNAMIC_MINOR,
 .name = DEVICE_NAME,
 .fops = &dev_fops,
};

static int __init dev_init(void)
{
 int ret;
 unsigned tmp;
 //init_MUTEX(&lock);
 tmp = readl(S3C64XX_GPFCON);
 tmp &= ~(0x3U << 28);            //set gpf14 is 00
 tmp |=  (0x1U << 28);            //set gpf14 is 01  output
 writel(tmp, S3C64XX_GPFCON);

 tmp = readl(S3C64XX_GPFPUD);
 tmp &= ~(0x3U << 28);            //gpf14 pull-up/down disable
 tmp |=  (0x2U << 28);            //gpf14 pull-up enable
 writel(tmp, S3C64XX_GPFPUD);

 tmp = readl(S3C64XX_GPFDAT);
 tmp &= ~(1<<14);                  //gpf14 set low level
 writel(tmp, S3C64XX_GPFDAT);

 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("StarFire WangYuechao");
MODULE_DESCRIPTION("S3C6410 Buzzer Driver");

转载:http://hi.baidu.com/kdwyc/blog/item/6cc28a24a5650d288744f9a6.html

启动树莓派后,新建文件夹7_joystick_PS2,进入编程\Mu.,在文件夹下建立joystick_PS2.py文件和PCF8591.py文件(参见实验PCF8591模数/数模转换器实验模块文件),按照实验要求,完成相应的功能。 # 说明:PS2操作杆实验,该实验依赖于pcf8591模块 ##################################################### import PCF8591 as ADC import time # 初始化 def makerobo_setup(): ADC.setup(0x48)# 设置PCF8591模块地址 global makerobo_state # 状态变量 # 方向判断函数 def makerobo_direction(): state = [&#39;home&#39;, &#39;up&#39;, &#39;down&#39;, &#39;left&#39;, &#39;right&#39;, &#39;pressed&#39;] # 方向状态信息 i = 0 if ADC.read(0) &lt;= 30: i = 1# up方向 if ADC.read(0) &gt;= 225: i = 2# down方向 if ADC.read(1) &gt;= 225: i = 4# left方向 if ADC.read(1) &lt;= 30: i = 3# right方向 if ADC.read(2) == 0 and ADC.read(1) == 128: i = 5# Button按下 # home位置 if ADC.read(0) - 125 &lt; 15 and ADC.read(0) - 125 &gt; -15and ADC.read(1) - 125 &lt; 15 and ADC.read(1) - 125 &gt; -15 and ADC.read(2) == 255: i = 0 return state[i] # 返回状态 # 循环函数 def makerobo_loop(): makerobo_status = &#39;&#39; # 状态值赋空值 while True: makerobo_tmp = makerobo_direction() # 调用方向判断函数 if makerobo_tmp != None and makerobo_tmp != makerobo_status: # 判断状态是否发生改变 print (makerobo_tmp) # 打印出方向位 makerobo_status = makerobo_tmp # 把当前状态赋给状态值,以防止同一状态多次打印 # 异常处理函数 def destroy(): pass # 程序入口 if __name__ == &#39;__main__&#39;: makerobo_setup() # 初始化 try: makerobo_loop() # 调用循环函数 except KeyboardInterrupt: # 当按下Ctrl+C时,将执行destroy()子程序。 destroy() # 调用释放函数 下一节上一节1、显示操纵杆X、Y和Z轴的数值。 2、增加LED灯模块,根据操纵杆的位置控制LED灯的明暗变化。 下一节上一节
最新发布
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值