linux驱动之定时器,linux驱动之PWM(定时器)
说明:以下由两部分组成,定时器驱动、定时器应用程序构成;
1.驱动程序;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "CL_beep"
#define BEEP_MAJOR 233
static int CL_beep_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
unsigned long temp;
unsigned long gpbcon;
unsigned long tcfg0;
unsigned long tcfg1;
unsigned long tcntb;
unsigned long tcmpb;
unsigned long tcon;
struct clk *clk_p;
unsigned long pclk;
printk("Kernel info: cmd=%d....\n", cmd);
if (cmd <= 0) {
temp = __raw_readl(S3C2410_GPBCON);
temp &= ~3;
temp |= 1; /*管脚功能定义为-输出*/
__raw_writel(temp, S3C2410_GPBCON);
temp = __raw_readl(S3C2410_GPBDAT);
temp &= ~1;
__raw_writel(temp, S3C2410_GPBDAT);
} else {
gpbcon = __raw_readl(S3C2410_GPBCON);
gpbcon &= ~3;
gpbcon |= 2; /*管脚功能定义为-定时器*/
__raw_writel(gpbcon, S3C2410_GPBCON);
/*定时器输入时钟频率=PCLK/(预分频值+1)/(分频值)
=PCLK/(15+1)/(1/8) */
tcfg0 = __raw_readl(S3C2410_TCFG0);
tcfg0 &= ~0xff;
tcfg0 |= 15; /*定时器预分频值为15*/
__raw_writel(tcfg0, S3C2410_TCFG0);
tcfg1 = __raw_readl(S3C2410_TCFG1);
tcfg1 &= ~0xf;
tcfg1 |= 2; /*定时器分频值为2,即1/8分频*/
__raw_writel(tcfg1, S3C2410_TCFG1);
clk_p = clk_get(NULL, "pclk");
pclk = clk_get_rate(clk_p);
printk("Kernel info: pclk=%d\n", pclk);
if (arg == 0)
arg = 1;
tcntb = (pclk/128)/arg; /*定时器计数缓冲寄存器*/
__raw_writel(tcntb, S3C2410_TCNTB(0));
printk("Kernel info: tcntb=%d\n", tcntb);
tcmpb = tcntb>>1; /*定时器比较缓冲寄存器*/
__raw_writel(tcmpb, S3C2410_TCMPB(0));
printk("Kernel info: tcmpb=%d\n", tcmpb);
tcon = __raw_readl(S3C2410_TCON);
tcon &= ~0x1f;
tcon |= 0x0b;
__raw_writel(tcon, S3C2410_TCON);
tcon &= ~2; /*这里比较特殊,此为必须在下次写操作时清零!*/
__raw_writel(tcon, S3C2410_TCON);
}
return 0;
}
static struct file_operations CL_beep_fops = {
.owner = THIS_MODULE,
.ioctl = CL_beep_ioctl,
};
static struct class *beep_class;
static int __init CL_beep_init(void)
{
int ret;
/*注册字符设备驱动程序*/
ret = register_chrdev(BEEP_MAJOR, DEVICE_NAME, &CL_beep_fops);
if (ret) {
printk(DEVICE_NAME" can`t register major number.\n");
return ret;
}
/*注册一个类,使mdev可以在/dev目录下创建设备节点*/
beep_class = class_create(THIS_MODULE, DEVICE_NAME);
if (IS_ERR(beep_class)) {
printk("Err: create class failed.\n");
return -1;
}
/*创建一个设备节点,节点名为DEVICE_NAME*/
device_create(beep_class, NULL, MKDEV(BEEP_MAJOR, 0), NULL, DEVICE_NAME);
printk(DEVICE_NAME" initialized.\n");
return 0;
}
static void __exit CL_beep_exit(void)
{
unregister_chrdev(BEEP_MAJOR, DEVICE_NAME);
printk(DEVICE_NAME" exit!\n");
}
module_init(CL_beep_init);
module_exit(CL_beep_exit);
MODULE_AUTHOR("Cl learning...");
MODULE_DESCRIPTION("[2016-02-22] Cl Time0 for PWM test");
MODULE_LICENSE("GPL");
2.应用程序;
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "/dev/CL_beep"
int main(int argc, char *argv[])
{
int fd;
int i;
int cmd = 1;
unsigned long temp = 0;
fd = open(DEVICE_NAME, O_RDWR);
if (fd < 0){
perror("open fail:");
exit(1);
}
while(1){
scanf("%d", &temp);
printf("temp = %d\n", temp);
ioctl(fd, cmd, temp);
if (temp == 0)
break;
}
close(fd);
return 0;
}
linux驱动之定时器,linux驱动之PWM(定时器)相关推荐
- Linux利用platform_driver和设备树实现PWM驱动
Linux利用platform_driver和设备树实现PWM驱动 字符设备PWM驱动 一.PWM驱动的硬件资源 1.PWM工作原理 2.PWM电路原理 3.PWM内部结构 二.具体代码 1.设备树 ...
- 2022-10-20 Linux自带LED灯驱动gpio-leds 心跳呼吸灯heartbeat、定时器timer的使用
一.测试环境:Android 9 系统 二.驱动文件在\kernel\drivers\leds\leds-gpio.c 三.dts的官方配置文档 kernel\Documentation\device ...
- linux驱动开发5 按键中断实验(定时器和中断)
led:IO的输出 :key:IO的输入 法一:直接读写IO 使用while(1)无限读取,但CPU占用达到了99.6%,所以不行 #include <linux/types.h>#inc ...
- 裸机PWM驱动屏幕亮度(Linux驱动开发篇)
1.PWM简介 PWM信号有两个关键的术语: 频率(开关速度) 占空比(t/T) 2.pwm控制屏幕亮度的原理 假如我们不断的打开和关闭背光,当速度足够快的时候就不会感觉到背光关闭这个过程了 我们给 ...
- linux驱动模型开发——linux platform总线机制讲解与实例开发
1.概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C.IIS.RTC.看门狗等)都被当作平台设备来处理. 从Linux2.6起,引入了一套新的驱动管理和注册机制:Platfor ...
- Linux驱动之platform设备驱动
当我们在一块开发板上写好了驱动,但换一块不同芯片的开发板,我们就需要重新写一个驱动.其中主要是硬件连接也就是接口发生了改变,而软件框架几乎不用通用的.所以为了更加方便地移植,能够仅修改很小的内容就达到 ...
- platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架
platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...
- linux 深入理解I2C内核驱动
系列文章 I.MX6ULL 手册查找使用方法 实战点亮LED(寄存器版) I.MX6ULL 手册查找使用方法 实战点亮LED(固件库版本) linux 字符设备驱动实战 linux LED设备驱动文件 ...
- linux GPIO模拟PS2 键盘驱动
背景:公司有一个PS2键盘驱动的项目,没有控制器,需要模拟PS2协议,检测按键并通过input子系统将按键时间上报 一.准备: 1.PS2协议: PS2有两个控制线,时钟线和数据线.当按键按下或抬起, ...
- 嵌入式linux驱动-LCD液晶屏驱动
这里写目录标题 LCD简介 一些性能参数 eLCDIF 接口 linux下的LCD驱动 Framebuffer 设备 LCD 驱动介绍 LCD 驱动程序 LCD 屏幕 IO 配置 LCD 屏幕参数节点 ...
最新文章
- Json文件解析(上)
- 在Windows上运行Spark程序
- verilog基础--sign表达式
- apache服务器配置tls_Apache服务器配置https
- java notify唤醒原理_Java wait和notify虚假唤醒原理
- Java核心篇之HashMap--day6
- OpenCASCADE Texture Mapping
- C++ STL map和multimap的简单使用
- 阶段3 2.Spring_04.Spring的常用注解_4 由Component衍生的注解
- 通过pxe远程安装linux,通过PXE远程安装Linux系统
- LINUX SHELL命令ls只列出目录名
- 电线电缆的基本测试方法
- Linux 服务器CPU占用率100%,使用率高解决方案
- python往npy写入数据_Python 存取npy格式数据实例
- [Ansible专栏]Ansible条件判断的介绍和使用
- 捣鼓PlantUML(一、环境)
- 第二十一章 异步编程
- JAVA300集——面向对象编程-类和对象-构造方法及其重载-方法调用
- Entity Framework Core系列教程-23-原生SQL查询
- lua/cocos加载动画以及可以使用加载纹理的方式来替换图片并且加载个人制作的艺术字体(fnt字体)
热门文章
- Java双亲委派机制在Android的应用
- 联想g400从u盘启动计算机,联想g400s怎么重装系统 联想g400s重装系统方法【图文步骤】...
- IoT黑板报:Google宣战5G 敲响设备商警钟
- php微信app支付2次签名,微信APP支付,第二次生成签名问题
- 演员用计算机的词谱是什么,你算啥曲谱_计算器歌曲谱薛之谦-绅士
- 英语中的年份、日期、时间与数字的读法
- OPPO和华为手机哪个性价比高?热门代表对比立分高下
- 精准销售配合粉丝经济,打造新销售时代最热IP
- 3个超厉害的图片修复工具,模糊照片一键变清晰
- Huggingface填坑:Unexpected key(s) in state_dict: “roberta.pooler.dense.weight“....