tiny4412开发板LED灯驱动写法
简介
led灯成本很低,操控简单,在嵌入式产品中不可或缺,可以作为调试标识,状态指示等等,高级用法还可以作为呼吸灯进一步增强其美观性。本章介绍只控制led
灯的亮灭,tiny4412
开发板有四个LED
灯在核心板上供用户操作,led灯亮灭靠cpu
IO
口输出电平,具体操控看实际电路。
电路图
在tiny4412开发板上,led灯电路如下:
与CPU连接如下:
可以看到CPU相应引脚输出相关电平,就可以控制灯的亮灭,cpu引脚输出低电平led灯亮,接下来就是操作相关寄存器,这些寄存器与GPM4相关,一个是控制寄存器,一个是数据寄存器。
命令寄存器
数据寄存器
驱动代码
//驱动代码
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include <asm/io.h>
#include <asm/uaccess.h>#include<linux/fs.h>
#include<linux/cdev.h>
#include<linux/kdev_t.h>
#include<linux/slab.h>
#include<linux/device.h> //增加自动创建设备头文件
#include<linux/uaccess.h>
//定义字符设备结构体
static struct cdev *leddriver_cdev;
//定义设备号(包含主次)
static dev_t leddriver_num=0;
//定义设备类
static struct class *leddriver_class;
//定义设备结构体
static struct device *leddriver_device;
//定义错误返回类型
static int err;
//定义设备名称
#define LEDDRIVER_NAME "myled"#define GPM4CON_ADDR 0x110002E0
#define GPM4DAT_ADDR 0X110002E4static volatile unsigned long *gpm4con=NULL;
static volatile unsigned long *gpm4dat=NULL;#define GPM4CON *gpm4con
#define GPM4DAT *gpm4datstaticssize_t leddriver_read(struct file *file, char __user *usr, size_t size, loff_t *loft)
{unsigned char LED_STATUE;copy_from_user(&LED_STATUE,usr,1);printk("leddriver read is %d\r\n",LED_STATUE);switch(LED_STATUE){case 10:GPM4DAT |= (0x1<<0);break;case 11:GPM4DAT &=~(0X1<<0);break;case 20:GPM4DAT |= (0x1<<1);break;case 21:GPM4DAT &=~(0X1<<1);break;case 30:GPM4DAT |= (0x1<<2);break;case 31:GPM4DAT &=~(0X1<<2);break;case 40:GPM4DAT |= (0x1<<3);break;case 41:GPM4DAT &=~(0X1<<3);break;}return 0;
}ssize_t leddriver_write (struct file *file, const char __user *usr, size_t size, loff_t *loft)
{printk("leddriver write is ok\r\n");return 0;
}int leddriver_open (struct inode *node, struct file *file)
{printk("files open is success\r\n");return 0;
}int leddriver_release (struct inode *node, struct file *file)
{printk("leddriver close is success\r\n");return 0;
}//文件操作函数结构体
static struct file_operations leddriver_fops={
.owner=THIS_MODULE,.open=leddriver_open,.release=leddriver_release,.read=leddriver_read,.write=leddriver_write,
};static __init int ldedriver_init(void)
{
//分配字符设备结构体,前面只是定义没有分配空间
leddriver_cdev=cdev_alloc();
//判断分配成功与否
if(leddriver_cdev==NULL)
{err=-ENOMEM;printk("leddriver alloc is err\r\n");goto err_leddriver_alloc;
}//动态分配设备号
err=alloc_chrdev_region(&leddriver_num, 0, 1, LEDDRIVER_NAME);
//错误判断
if(err<0)
{printk("alloc leddriver num is err\r\n");goto err_alloc_chrdev_region;
}//初始化结构体
cdev_init(leddriver_cdev,&leddriver_fops);//驱动注册
err=cdev_add(leddriver_cdev,leddriver_num,1);
if(err<0)
{printk("cdev add is err\r\n");goto err_cdev_add;
}//创建设备类
leddriver_class=class_create(THIS_MODULE,"led_class");err=PTR_ERR(leddriver_class);if(IS_ERR(leddriver_class)){
printk("leddriver creat class is err\r\n");
goto err_class_create;}//创建设备leddriver_device=device_create(leddriver_class,NULL, leddriver_num,NULL, "leddevice");err=PTR_ERR(leddriver_device);if(IS_ERR(leddriver_device)){
printk("leddriver device creat is err \r\n");
goto err_device_create;}
//led灯寄存器配置gpm4con=ioremap(GPM4CON_ADDR, 4);gpm4dat=ioremap(GPM4DAT_ADDR, 4);GPM4CON &= ~(0XFFFF<<0);GPM4CON |= (0x1111<<0);GPM4DAT |= (0XF<<0);printk("leddriver init is success\r\n");
return 0;err_device_create:
class_destroy(leddriver_class);
err_class_create:cdev_del(leddriver_cdev);
err_cdev_add:
unregister_chrdev_region(leddriver_num, 1);err_alloc_chrdev_region:
kfree(leddriver_cdev);err_leddriver_alloc:
return err;}static __exit void leddriver_exit(void)
{//取消映射iounmap(gpm4con);iounmap(gpm4dat);device_destroy(leddriver_class,leddriver_num);class_destroy(leddriver_class);cdev_del(leddriver_cdev);unregister_chrdev_region(leddriver_num, 1);printk("leddriver is exit\r\n");
}module_init(ldedriver_init);
module_exit(leddriver_exit);
MODULE_LICENSE("GPL");
app代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main(int argc,char *argv[])
{unsigned char LED_STATUE,shi;int ge;int led_fp;led_fp = open(argv[1],O_RDWR);// LED_STATUE=(unsigned char)atoi(argv[2]);while(1){for(shi=1;shi<=4;shi++){for(ge=1;ge>=0;ge--){LED_STATUE=shi*10+ge;read(led_fp,&LED_STATUE,1);sleep(1);}}}close(led_fp);
}
Makefile
KERN_DIR = /zhangchao/linux3.5/linux-3.5
all:make -C $(KERN_DIR) M=`pwd` modules
cp:cp ./* /zhangchao/rootfs/zhangchao
clean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.order
obj-m += led.o
说明
虽然调用read write函数,来实现对灯的控制,并不符合函数操作规范,这里的led灯并不能看做是一个文件操作,并没有体现出linux一切皆文件,并不符合标准的文件操作方法,规范化写法将在后面给出。
tiny4412开发板LED灯驱动写法相关推荐
- Tiny4412开发板 LED灯的控制
exynos4412裸版控制led灯. 1.查看电路图. 2.查看4412手册.找到对应的寄存器. 3.配置对应的寄存器. 一.再开发板上我们的外部设备led,在核心板.所以我们需要打开核心板电路图. ...
- 单片机学习(二)开发板LED灯的控制
文章目录 开发板上LED灯相关的电路图 点灯 LED闪烁 LED流水灯 其他效果 灯光二进制计数器 进阶版流水灯 开发板上LED灯相关的电路图 这是P2相关7个引脚的电路图,在默认情况下它是直接接着V ...
- 三,天猫精灵SDK驱动开发板LED
1,启动流程: bootload->main(8710SDK)->aosmaintask->application->application_start 创建项目出现如下错误: ...
- STM32MP157驱动开发——Linux自带的LED灯驱动
STM32MP157驱动开发--Linux自带的LED灯驱动 0.前言 一.Linux 内核自带 LED 驱动使能 二.驱动简介 1.LED灯驱动框架分析 2.module_platform_driv ...
- S3C6410开发板LED驱动代码分析及测试代码分析
在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...
- 全志V3S开发板LED驱动
全志V3S开发板LED驱动 本文用的是全志开发板,在此开发板环境是店家提供,之前看了一片文章是利用编译内核的方式得到.ko文件,本文采用韦东山老师的方式make并且点亮LED. 1.由于v3ssdk目 ...
- Linux 自带的LED 灯驱动实验
目录 Linux 内核自带LED 驱动使能 Linux 内核自带LED 驱动简介 LED 灯驱动框架分析 module_platform_driver 函数简析 gpio_led_probe 函数简析 ...
- [ESP32/ESP8266专题笔记-6] ESP8266开发板-Micropython-WS2812灯的控制
WS2812全彩LED简介 所谓基于WS2812B的LED灯珠,就是将一个控制芯片封装进全彩LED灯珠中,配合单独的通信协议可以实现对单个灯的全彩控制 WS2812 全彩LED灯珠封装实物图 WS28 ...
- Linux 自带的 LED 灯驱动
1 Linux 内核自带 LED 驱动使能 Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动,输入如 ...
最新文章
- 零基础学python需要多久-零基础学python大概要多久
- 微软的公开的DLL库
- TypeScript 里的 module 概念
- .NET Core 1.1 升级公告
- 非vue子页面 调用vue父页面方法
- 地大计算机学院保研华科人数,2020年华中科技大学保研率是多少
- vscode-设置tab转空格数4为2
- 为什么要玩FLTK(Fast Light Tool Kit)
- DSP 2812: 使用C++封装外设时钟控制
- 2008年中国网游产业发展六大趋势
- 拼图(九宫格,十六宫格)
- 云计算数据中心是什么,云计算数据中心和传统IDC有何区别?
- word按backspace键不能删除问题
- java京东秒杀_小猿圈Python之实现京东秒杀功能技巧
- 机器指令程序编写方法
- 多媒体融合通信系统在铁路系统编组站的应用
- zookeeper 进行监听节点机制
- [ZZ]浅谈中国B2C珍珑棋局
- 97年黑客设计大赛中冠军作品
- 程序人生:初学者中最最最常问的问题都有哪些呢???
热门文章
- 一个暴风雨的夜晚——一个普通而又伟大老师的一天
- 解决Win10下海马玩模拟器蓝屏问题
- 一起来聊聊MySQL 8.0 的特性及排名可好?
- 1加6投屏_全球首批!一场最“快”的OnePlus 6 加油聚会
- 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析
- 统计英文字符串里重复次数最多的单词JAVA
- 计算机打开后任务栏有但桌面不显示不出来,电脑开机后不显示桌面图标和任务栏,鼠标可以动但是右键没反应,任务管理器能启动,该怎么解决啊?...
- matlab频谱校正方法,离散频谱的比值校正法
- 企业级与消费级硬盘,你应该选择哪一个?
- RSD的面向对象分类设计