mini2440驱动分析之PWM
1. pwm驱动也是作为杂项设备注册的,同样为了防止并发造成的竞态,有个信号量保护。模块的初始化函数

[plain] view plaincopy
  1. static int __init dev_init(void)
  2. {
  3. int ret;
  4. init_MUTEX(&lock);
  5. ret = misc_register(&misc);
  6. printk (DEVICE_NAME"\tinitialized\n");
  7. return ret;
  8. }

这个函数就是初始化了一个信号量,然后调用misc_register注册到杂项设备

2. 这个pwm驱动的基本功能体现在ioctl方法上
[plain] view plaincopy
  1. static int s3c24xx_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  2. {
  3. //printk("ioctl pwm: %x %lx\n", cmd, arg);
  4. switch (cmd) {
  5. case PWM_IOCTL_SET_FREQ:
  6. if (arg == 0)
  7. return -EINVAL;
  8. PWM_Set_Freq(arg);
  9. break;
  10. case PWM_IOCTL_STOP:
  11. PWM_Stop();
  12. break;
  13. }
  14. return 0;
  15. }

可以看出,只提供两个选项,一个是设置频率(调用PWM_Set_Freq函数),一个是停止。其他的功能都没有,这充分体现驱动程序中 “提供机制而不是提供策略”的思想,驱动程序中只提供基本的功能实现,其他复杂的功能由应用程序提供。
3. PWM_Set_Freq(arg)函数分析

[plain] view plaincopy
  1. static void PWM_Set_Freq( unsigned long freq )
  2. {
  3. unsigned long tcon;
  4. unsigned long tcnt;
  5. unsigned long tcfg1;
  6. unsigned long tcfg0;
  7. struct clk *clk_p;
  8. unsigned long pclk;
  9. //set GPB0 as tout0, pwm output
  10. s3c2410_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);
  11. tcon = __raw_readl(S3C2410_TCON);
  12. tcfg1 = __raw_readl(S3C2410_TCFG1);
  13. tcfg0 = __raw_readl(S3C2410_TCFG0);
  14. //prescaler = 50
  15. tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
  16. tcfg0 |= (50 - 1);
  17. //mux = 1/16
  18. tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
  19. tcfg1 |= S3C2410_TCFG1_MUX0_DIV16;
  20. __raw_writel(tcfg1, S3C2410_TCFG1);
  21. __raw_writel(tcfg0, S3C2410_TCFG0);
  22. clk_p = clk_get(NULL, "pclk");
  23. pclk  = clk_get_rate(clk_p);
  24. tcnt  = (pclk/50/16)/freq;
  25. __raw_writel(tcnt, S3C2410_TCNTB(0));
  26. __raw_writel(tcnt/2, S3C2410_TCMPB(0));
  27. tcon &= ~0x1f;
  28. tcon |= 0xb;        //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
  29. __raw_writel(tcon, S3C2410_TCON);
  30. tcon &= ~2;         //clear manual update bit
  31. __raw_writel(tcon, S3C2410_TCON);
  32. }

主要是对操作pwm的寄存器进行设置,跟裸机的设置一样,但是可以看出,驱动程序中设置寄存器都是采用读修改写的方式进行的。 像S3C2410_TCON S3C2410_TCFG1_MUX0_MASK 都是在regs-timer.h中定义的,直接使用就可以了。

mini2440驱动分析之PWM相关推荐

  1. mini2440驱动分析之触摸屏

    mini2440驱动分析之触摸屏 mini2440触摸屏驱动对应的文件为mini2440_ts.c,他是作为输入设备注册到内核的,功能实现是通过输入子系统来完成的,现在分析触摸屏的实现.以后再分析输入 ...

  2. mini2440驱动分析之ADC

    mini2440驱动分析之ADC 1 . ADC_DEV 结构 [plain] view plaincopy typedef struct { wait_queue_head_t wait; int  ...

  3. mini2440驱动分析之LCD

    mini2440集成了lcd控制器的接口,板子上接的lcd硬件是统宝240*320,TFT型lcd.lcd驱动对应的文件为s3c2410fb.c.要读懂这个驱动必须了解linux platform子系 ...

  4. linux 触摸屏驱动分析

    mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...

  5. [Android6.0][RK3399] PWM Backlight 驱动分析

    DTS 分析 backlight: backlight {status = "disabled";compatible = "pwm-backlight";pw ...

  6. linux 网卡驱动分析,LINUX_网卡驱动分析

    LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...

  7. MTK6797 Accdet驱动分析总结

    6735平台上耳机配置 (2016-07-05 19:57:29) 转载▼ 标签: 一牛网 mt6735 mtk   6735平台上耳机相关的宏有下面三个: Audio define@ alps\ve ...

  8. zz-linux-i2c驱动分析am335x框架调用150103d

    //zz//####################################################################### zz-linux-i2c驱动分析am335x ...

  9. Linux下的USB总线驱动(三) u盘驱动分析

    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 4.U盘驱动分析 USB Mass Storage是一类USB存储设备,这些设备包括USB磁盘.USB硬盘 ...

最新文章

  1. 360浏览器如何保存html文件夹下,在360浏览器中将书签保存的详细步骤
  2. 视频目标检测--Flow-Guided Feature Aggregation for Video Object Detection
  3. 【RocketMQ工作原理】indexFile
  4. 5-Python3从入门到实战—基础之数据类型(列表-List)
  5. Python·Jupyter Notebook各种使用方法
  6. python word转txt_Python办公自动化| word 表格转excel
  7. [Diary]6.10
  8. c语言 数组、字符串的形参格式_华中师范大学计算机考研874C语言笔记(一)
  9. centos6 安装xhprof扩展
  10. java uml eclipse_eclipse uml 工具
  11. C#中const和readonly有什么区别?
  12. mysql查询中使用别名_在mysql子查询中使用外部别名
  13. 01. 慎重选择容器类型
  14. python结构模式_Python程序中的观察者模式结构编写
  15. matlab计算机械臂素的,机械臂动力学——动力学建模
  16. Jmeter脚本录制 badboy的下载安装教程
  17. linux下anjuta_[分享] Linux下用Anjuta写个Hello World 的C++程序竟如此简单!
  18. matlab直方图概率密度图,histeq从用法到原理——Matlab直方图均衡化函数
  19. 使用python爬取股票基金的最新数据消息,并用Excel绘制树状图一目了然
  20. 新三板专家程晓明:四板将是推动区块链技术与资本市场结合试验田

热门文章

  1. moodeaudio 源码_MoodeAudio 音频播放器上手配置
  2. LGBM模型取消打印日志(关闭日志)
  3. 使用selenium启动(无界面)浏览器的隐私模式
  4. linux查看后台执行的所有任务与对应的命令
  5. jQuery和react实现二维码
  6. .net Core 介绍
  7. dijkstra 最短路算法
  8. GoF著作中未提到的设计模式(4):Double Dispatch
  9. php添加gd库,linux下为php添加GD库(重新编译php)
  10. ie代理配置错误_电缆厂组织结构图的7个常犯错误!