我们buzzer的驱动,我们是基于杂项类设备驱动


杂项类设备驱动框架:misc.c文件,里面做了这些事:
1.class_create(THIS_MODULE, “misc”); 在/sys/class 下面创建了misc类
2.register_chrdev(MISC_MAJOR,“misc”,&misc_fops) 注册字符设备驱动,主设备号是10
3.提供杂项类设备的注册/注销方法misc_register/misc_deregister


buzzer驱动:
1.init_MUTEX(&lock); 初始化信号量
2.misc_register(&misc); 注册杂项类设备驱动,需要自己定义如下的结构体:

static struct file_operations dev_fops = {.owner   =   THIS_MODULE,.open    =   x210_pwm_open,.release =   x210_pwm_close, .ioctl   =   x210_pwm_ioctl, };static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name= DEVICE_NAME,
.fops = &dev_fops, };

3.gpio_request(S5PV210_GPD0(2), “GPD0”); 申请与buzzer相连接的gpio的使用权限
4.申请到gpio的使用权限之后,对gpio进行相关的操作,GPIO相关操作:
<1>申请gpio,设置上拉
<2>设置输出模式,输出0
5.open函数和close函数里面用了一个信号量,保证这个设备节点只能被一个进程打开
6.ioctl函数里面实现了 pwm_set_freq 和 pwm_stop两个函数
7.pwm_stop 函数就是把gpio改为了input模式


pwm设置频率,这个比较重要:
8.pwm_set_freq
<1>首先把gpio设置为了 pwm输出模式
<2>设置PRESCALER和MUX都为1/16, 相当于用pclk/16/16,所以我们控制单元的时钟就是pclk/16/16, f = 1 / t, 那么t_con = 1 / (pclk/16/16)
<3>我们TCNT寄存器里面的值的减少,是以t_con为基准的,例如我们TCNT的值是100,那么TCNT减少到0就是一个周期,这个周期t = t_con x 100, 那么f = 1 / (t_con x 100)
<4>这里我们假设:TCNT = n, 那么这个n减少到0所用的时间 T=t_con x n, 那么频率
f = 1 / (t_con x n), 所以 n = 1 / (f x (1 / (pclk/16/16)) )
所以n x (1 / (pclk/16/16) = 1 / f
n = (pclk/16/16) / f, 所以这里我们设置频率为f_set的时候,TCNT就是这样算出来的
<5>TCNT的值是控制我们的周期的,TCMP的值是设置占空比的。TCNT寄存器只是设置cnt值的,
最后是TCNTB里面的值–。TCNTB里面的值是TCNT刷进去的。一般情况下当TCNTB的值大于 TCMP的时候,输出的信号是高电平,反之,则为低电平。
<6>打开自动刷新,关闭翻转(电平的翻转),手动刷新TCNT和TCMP寄存器到TCNTB和TCMPB中, 打开定时器
<7>关闭手动刷新,第一次需要手动刷新值到TCNTB和TCMPB寄存器中,之后就不需要了

static void PWM_Set_Freq( unsigned long freq )
{unsigned long tcon;unsigned long tcnt;unsigned long tcfg1;struct clk *clk_p;unsigned long pclk;//unsigned tmp;//设置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/16tcfg1 &= ~(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);     __raw_writel(tcon, S3C2410_TCON);tcon &= ~(2<<12);           //clear manual update bit__raw_writel(tcon, S3C2410_TCON);
}

S5PV210 buzzer驱动相关推荐

  1. S5PV210 camera 驱动分析(android)

    一.Camera 工作原理介绍 1. 结构 . 一般来说,camera 主要是由 lens 和 sensor IC 两部分组成,其中有的 sensor IC 集成 了 DSP,有的没有集成,但也需要外 ...

  2. Android S5PV210 camera驱动(tw9912)小结

    之前没接触过三星的开发板,更不了解S5PV210,TW9912这款AD芯片也是第一次接触,三星FAE又不给力(其实是没有),调试camera过程中,一会怀疑TW9912配置不对,一会怀疑三星FIMC驱 ...

  3. S5PV210 ADC驱动分析

    我这里用的是mini210开发板,在其内核源码中,采用了Linux设备驱动模型中的platform虚拟总线来管理ADC设备.首先看S5PV210提供的ADC驱动接口.在plat-samsung/dev ...

  4. S5PV210开发 -- 驱动开发相关硬件简介

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78485355 到此,开发板已经是算跑起来了.系统移植部分稍后再讲.我们先举两 ...

  5. S5PV210 GPIO驱动及其在android2.3.1下jni调用

    1.编写GPIO驱动并编译为模块 完全按照linux驱动的编写方式,封装为标准的linux字符驱动 2.使用C语言编写测试程序 编写.编译一个操作led的程序进行驱动测试 以上两步可参考<s5p ...

  6. S5PV210 按键驱动源码、应用程序解析(重点:中断、休眠唤醒、定时器)

    按键驱动是最简单的功能,一旦使用linux来做就需要做很多功课.anyway,逻辑层还是前年不变的.先贴上驱动层代码. /** linux/drivers/char/mini210_buttons.c ...

  7. S5PV210开发 -- I2C 你知道多少?(三)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78835639 I2C部分已经接近尾声了,接下来我们回过头来看一下剩下的一些小 ...

  8. android系统平台显示驱动开发简要:Samsung LCD接口篇『三』

    平台信息: 内核:linux3.4.39 系统:android4.4  平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新 ...

  9. Android LCD(三):LCD接口篇【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/9177085 关键词:Android LCD控制器 Framebuffer PWM  平 ...

最新文章

  1. 简单的文本框输入实时计数
  2. 研发管理工具之迭代管理测评:PingCode VS Jira
  3. Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
  4. Matlab在概率统计中的应用问题及解决方案集锦
  5. iBATIS In Action:使用高级查询技术(一)
  6. 应用新的JDK 11字符串方法
  7. 进程间同步(互斥量、信号量)
  8. Quantumas,作者太NB了,俺发现俺菜得跟猪一样!!!
  9. 【qduoj - 142】 多重背包(0-1背包的另类处理,dp)
  10. java一个式子开根号语句_Oracle查询语句,你知道几个?(上)
  11. Centos7升级Python2到Python3
  12. oracle wmsys.wm_concat函数
  13. 用musescore做吉他弹唱谱
  14. 福禄克OTDR系列OFP-100-Q光纤测试仪
  15. openwrt设置DNS
  16. WP下载,WP源码下载,WP模板主题下载
  17. 用Python找101-200之间的素数
  18. css 网格布局_CSS网格布局三年
  19. 沙箱支付宝支付 前后端分离项目 实战
  20. 假设有四个作业,它们的提交、运行时间如下表所示。若采用高响应比优先调度算法,试问平均周转时间和平均带权周转时间为多少?

热门文章

  1. UE4 如何解决摄像头移动毛边问题
  2. 向量学习过程思想总结概括
  3. asp.net core 日志中间件(LoggerMiddleware)
  4. 英语水平测试项目(黄军威、殷乐乐、张益维20180531)
  5. Pumpkin Garden 靶场实战
  6. 京东云mysql镜像_京东云数据库RDS SQL Server高可用概述
  7. 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数
  8. 基于阿里云的双活灾备方案的设计
  9. web 系统原理之路由器和交换机的区别
  10. linux ping结果中mdev,ping之mdev值