1. pwm驱动也是作为杂项设备注册的,同样为了防止并发造成的竞态,有个信号量保护。模块的初始化函数
static int __init dev_init(void)
{
int ret;
init_MUTEX(&lock);
ret = misc_register(&misc);
printk (DEVICE_NAME"tinitializedn");
return ret;
}
这个函数就是初始化了一个信号量,然后调用misc_register注册到杂项设备
2. 这个pwm驱动的基本功能体现在ioctl方法上
static int s3c24xx_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
//printk("ioctl pwm: %x %lxn", 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驱动分析之ADC
下一篇:mini2440驱动分析之LED
推荐阅读最新更新时间:2024-11-19 19:59
设计资源 培训 开发板 精华推荐
- NCP301LSN27T1 2.7V双电源欠压监测典型应用
- 使用 Microchip Technology 的 LR8N3GP002 的参考设计
- MIC2012YM USB电源控制器典型应用
- PAM8945-EV,基于 PAM8945 高效 G 类音频功率放大器的评估板
- TLE 7272 5V 低压降稳压器的典型应用
- 具有输出断开连接的 LTC3121EDE 5V 至 12V 同步升压转换器的典型应用电路
- DER-429 - 18至25W隔离式反激式、恒定电流和恒定电压LED驱动器
- DER-453 - 45 W 单输出次级侧稳压转换器
- NSI50350AST3G 恒流 LED 灯串驱动器的典型应用
- TB67S511FTAG 相位输入控制双极步进电机驱动器应用说明
- Digi-Key KOL视频来袭~资深算法工程师畅聊图像处理秘诀
- TI CC1310网络研讨会诚邀您预报名参加,惊喜奖不停!
- 用富士通Cortex-M3 Easy Kit开发板,DIY出你的精彩!l
- 【TI.com线上采购专场——智能楼宇篇】畅聊火爆的智能电子锁、可视化门铃、智能传感器和网络摄像头方案
- 有奖直播:清洁水源的守护 —— ADI 水质监测方案
- 有奖直播:安森美光伏和储能产品介绍
- 学AM335X课程,赢超值BB-Black团购资格,更有DIY大奖赛预热中!
- 是德科技直播 | 小探头,大学问,别让探头拖累你的测试结果!
- Microchip有奖问答 | 新品 MCU 独立于内核的外设(CIP)技术解密