简介

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灯驱动写法相关推荐

  1. Tiny4412开发板 LED灯的控制

    exynos4412裸版控制led灯. 1.查看电路图. 2.查看4412手册.找到对应的寄存器. 3.配置对应的寄存器. 一.再开发板上我们的外部设备led,在核心板.所以我们需要打开核心板电路图. ...

  2. 单片机学习(二)开发板LED灯的控制

    文章目录 开发板上LED灯相关的电路图 点灯 LED闪烁 LED流水灯 其他效果 灯光二进制计数器 进阶版流水灯 开发板上LED灯相关的电路图 这是P2相关7个引脚的电路图,在默认情况下它是直接接着V ...

  3. 三,天猫精灵SDK驱动开发板LED

    1,启动流程: bootload->main(8710SDK)->aosmaintask->application->application_start 创建项目出现如下错误: ...

  4. STM32MP157驱动开发——Linux自带的LED灯驱动

    STM32MP157驱动开发--Linux自带的LED灯驱动 0.前言 一.Linux 内核自带 LED 驱动使能 二.驱动简介 1.LED灯驱动框架分析 2.module_platform_driv ...

  5. S3C6410开发板LED驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...

  6. 全志V3S开发板LED驱动

    全志V3S开发板LED驱动 本文用的是全志开发板,在此开发板环境是店家提供,之前看了一片文章是利用编译内核的方式得到.ko文件,本文采用韦东山老师的方式make并且点亮LED. 1.由于v3ssdk目 ...

  7. Linux 自带的LED 灯驱动实验

    目录 Linux 内核自带LED 驱动使能 Linux 内核自带LED 驱动简介 LED 灯驱动框架分析 module_platform_driver 函数简析 gpio_led_probe 函数简析 ...

  8. [ESP32/ESP8266专题笔记-6] ESP8266开发板-Micropython-WS2812灯的控制

    WS2812全彩LED简介 所谓基于WS2812B的LED灯珠,就是将一个控制芯片封装进全彩LED灯珠中,配合单独的通信协议可以实现对单个灯的全彩控制 WS2812 全彩LED灯珠封装实物图 WS28 ...

  9. Linux 自带的 LED 灯驱动

    1 Linux 内核自带 LED 驱动使能 Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动,输入如 ...

最新文章

  1. 零基础学python需要多久-零基础学python大概要多久
  2. 微软的公开的DLL库
  3. TypeScript 里的 module 概念
  4. .NET Core 1.1 升级公告
  5. 非vue子页面 调用vue父页面方法
  6. 地大计算机学院保研华科人数,2020年华中科技大学保研率是多少
  7. vscode-设置tab转空格数4为2
  8. 为什么要玩FLTK(Fast Light Tool Kit)
  9. DSP 2812: 使用C++封装外设时钟控制
  10. 2008年中国网游产业发展六大趋势
  11. 拼图(九宫格,十六宫格)
  12. 云计算数据中心是什么,云计算数据中心和传统IDC有何区别?
  13. word按backspace键不能删除问题
  14. java京东秒杀_小猿圈Python之实现京东秒杀功能技巧
  15. 机器指令程序编写方法
  16. 多媒体融合通信系统在铁路系统编组站的应用
  17. zookeeper 进行监听节点机制
  18. [ZZ]浅谈中国B2C珍珑棋局
  19. 97年黑客设计大赛中冠军作品
  20. 程序人生:初学者中最最最常问的问题都有哪些呢???

热门文章

  1. 一个暴风雨的夜晚——一个普通而又伟大老师的一天
  2. 解决Win10下海马玩模拟器蓝屏问题
  3. 一起来聊聊MySQL 8.0 的特性及排名可好?
  4. 1加6投屏_全球首批!一场最“快”的OnePlus 6 加油聚会
  5. 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析
  6. 统计英文字符串里重复次数最多的单词JAVA
  7. 计算机打开后任务栏有但桌面不显示不出来,电脑开机后不显示桌面图标和任务栏,鼠标可以动但是右键没反应,任务管理器能启动,该怎么解决啊?...
  8. matlab频谱校正方法,离散频谱的比值校正法
  9. 企业级与消费级硬盘,你应该选择哪一个?
  10. RSD的面向对象分类设计