mini2440驱动分析之PWM
- static int __init dev_init(void)
- {
- int ret;
- init_MUTEX(&lock);
- ret = misc_register(&misc);
- printk (DEVICE_NAME"\tinitialized\n");
- return ret;
- }
这个函数就是初始化了一个信号量,然后调用misc_register注册到杂项设备
- 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;
- }
可以看出,只提供两个选项,一个是设置频率(调用PWM_Set_Freq函数),一个是停止。其他的功能都没有,这充分体现驱动程序中 “提供机制而不是提供策略”的思想,驱动程序中只提供基本的功能实现,其他复杂的功能由应用程序提供。
3. PWM_Set_Freq(arg)函数分析
- 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);
- }
主要是对操作pwm的寄存器进行设置,跟裸机的设置一样,但是可以看出,驱动程序中设置寄存器都是采用读修改写的方式进行的。 像S3C2410_TCON S3C2410_TCFG1_MUX0_MASK 都是在regs-timer.h中定义的,直接使用就可以了。
mini2440驱动分析之PWM相关推荐
- mini2440驱动分析之触摸屏
mini2440驱动分析之触摸屏 mini2440触摸屏驱动对应的文件为mini2440_ts.c,他是作为输入设备注册到内核的,功能实现是通过输入子系统来完成的,现在分析触摸屏的实现.以后再分析输入 ...
- mini2440驱动分析之ADC
mini2440驱动分析之ADC 1 . ADC_DEV 结构 [plain] view plaincopy typedef struct { wait_queue_head_t wait; int ...
- mini2440驱动分析之LCD
mini2440集成了lcd控制器的接口,板子上接的lcd硬件是统宝240*320,TFT型lcd.lcd驱动对应的文件为s3c2410fb.c.要读懂这个驱动必须了解linux platform子系 ...
- linux 触摸屏驱动分析
mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...
- [Android6.0][RK3399] PWM Backlight 驱动分析
DTS 分析 backlight: backlight {status = "disabled";compatible = "pwm-backlight";pw ...
- linux 网卡驱动分析,LINUX_网卡驱动分析
LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...
- MTK6797 Accdet驱动分析总结
6735平台上耳机配置 (2016-07-05 19:57:29) 转载▼ 标签: 一牛网 mt6735 mtk 6735平台上耳机相关的宏有下面三个: Audio define@ alps\ve ...
- zz-linux-i2c驱动分析am335x框架调用150103d
//zz//####################################################################### zz-linux-i2c驱动分析am335x ...
- Linux下的USB总线驱动(三) u盘驱动分析
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 4.U盘驱动分析 USB Mass Storage是一类USB存储设备,这些设备包括USB磁盘.USB硬盘 ...
最新文章
- 360浏览器如何保存html文件夹下,在360浏览器中将书签保存的详细步骤
- 视频目标检测--Flow-Guided Feature Aggregation for Video Object Detection
- 【RocketMQ工作原理】indexFile
- 5-Python3从入门到实战—基础之数据类型(列表-List)
- Python·Jupyter Notebook各种使用方法
- python word转txt_Python办公自动化| word 表格转excel
- [Diary]6.10
- c语言 数组、字符串的形参格式_华中师范大学计算机考研874C语言笔记(一)
- centos6 安装xhprof扩展
- java uml eclipse_eclipse uml 工具
- C#中const和readonly有什么区别?
- mysql查询中使用别名_在mysql子查询中使用外部别名
- 01. 慎重选择容器类型
- python结构模式_Python程序中的观察者模式结构编写
- matlab计算机械臂素的,机械臂动力学——动力学建模
- Jmeter脚本录制 badboy的下载安装教程
- linux下anjuta_[分享] Linux下用Anjuta写个Hello World 的C++程序竟如此简单!
- matlab直方图概率密度图,histeq从用法到原理——Matlab直方图均衡化函数
- 使用python爬取股票基金的最新数据消息,并用Excel绘制树状图一目了然
- 新三板专家程晓明:四板将是推动区块链技术与资本市场结合试验田
热门文章
- moodeaudio 源码_MoodeAudio 音频播放器上手配置
- LGBM模型取消打印日志(关闭日志)
- 使用selenium启动(无界面)浏览器的隐私模式
- linux查看后台执行的所有任务与对应的命令
- jQuery和react实现二维码
- .net Core 介绍
- dijkstra 最短路算法
- GoF著作中未提到的设计模式(4):Double Dispatch
- php添加gd库,linux下为php添加GD库(重新编译php)
- ie代理配置错误_电缆厂组织结构图的7个常犯错误!