[DM8168]Linux下控制GPIO实现LED流水灯
首先加载驱动模块,应用程序通过调用API实现GPIO控制功能。
驱动程序:
/*
* fileName: led_gpio.c
* just for LED GPIO test
* GP1_14 -> HDD
* GP1_15 -> REC
* GP1_27 -> NC
* GP1_28 -> IR
*/ #include <linux/device.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <linux/list.h>
#include <linux/cdev.h>
#include <linux/proc_fs.h>
#include <linux/mm.h>
#include <linux/seq_file.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <asm/io.h>
#include <linux/io.h>
#include <mach/gpio.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/ioctl.h> #define DRIVERNAME "led4" #define CTRL_MODULE_BASE_ADDR 0x48140000 // PANEL CON
#define conf_gpio46 (CTRL_MODULE_BASE_ADDR + 0x0B04)
#define conf_gpio47 (CTRL_MODULE_BASE_ADDR + 0x0B08)
#define conf_gpio59 (CTRL_MODULE_BASE_ADDR + 0x0AB8)
#define conf_gpio60 (CTRL_MODULE_BASE_ADDR + 0x0ABC) #define WR_MEM_32(addr, data) *(unsigned int*)OMAP2_L4_IO_ADDRESS(addr) = (unsigned int)(data)
#define RD_MEM_32(addr) *(unsigned int*)OMAP2_L4_IO_ADDRESS(addr) static dev_t dev;
static struct cdev cdev;
static struct class *led_gpio_class = NULL;
static int gpio[]; static int led_gpio_open(struct inode *inode, struct file *file);
static int led_gpio_close(struct inode *inode, struct file *file);
static long led_gpio_ioctl(struct file *file, unsigned int val, unsigned long pin);
//static int valid_check(unsigned int gpioNum); //////////////////////////////////////////////////////////////////////////////
/*-
static int valid_check(unsigned int gpioNum)
{
if((gpioNum==46)||(gpioNum==47)||(gpioNum==59)||(gpioNum==60))
return 1;
return -1;
}
-*/ static void store_gpio_pin(void)
{
// store gpio pinmux
gpio[] = RD_MEM_32(conf_gpio46);
gpio[] = RD_MEM_32(conf_gpio47);
gpio[] = RD_MEM_32(conf_gpio59);
gpio[] = RD_MEM_32(conf_gpio60);
} static void recover_gpio_pin(void)
{
// recover gpio pinmux
WR_MEM_32(conf_gpio46, gpio[]);
WR_MEM_32(conf_gpio47, gpio[]);
WR_MEM_32(conf_gpio59, gpio[]);
WR_MEM_32(conf_gpio60, gpio[]);
gpio_free(gpio[]);
gpio_free(gpio[]);
gpio_free(gpio[]);
gpio_free(gpio[]);
} static void config_gpio_pin(void)
{
WR_MEM_32(conf_gpio46, );
gpio_request(, "gpio46_en"); // request gpio46
gpio_direction_output(, ); WR_MEM_32(conf_gpio47, );
gpio_request(, "gpio47_en"); // request gpio47
gpio_direction_output(, ); WR_MEM_32(conf_gpio59, );
gpio_request(, "gpio59_en"); // request gpio59
gpio_direction_output(, ); WR_MEM_32(conf_gpio60, );
gpio_request(, "gpio60_en"); // request gpio60
gpio_direction_output(, );
} static int led_gpio_open(struct inode *inode, struct file *file)
{
// store gpio pin value
store_gpio_pin();
// configure all used gpio
config_gpio_pin();
return ;
} static int led_gpio_close(struct inode *inode, struct file *file)
{
// recover gpio pin mux;
recover_gpio_pin();
return ;
} static long led_gpio_ioctl(struct file *file, unsigned int val, unsigned long pin)
{
if(valid_check(pin) < ){
printk("GPIO:%d can't use!\n", (int)pin);
return -;
}
gpio_set_value(pin, val); return ;
} static struct file_operations led_gpio_fops =
{
.owner = THIS_MODULE,
.open = led_gpio_open,
.release = led_gpio_close,
.unlocked_ioctl = led_gpio_ioctl,
}; static int __init LED_init(void)
{
int result; result = alloc_chrdev_region(&dev, , , DRIVERNAME);
if(result < ){
printk("Error registering led_gpio character device\n");
return -ENODEV;
}
printk(KERN_INFO "led_gpio major#: %d, minor#: %d\n", MAJOR(dev), MINOR(dev)); cdev_init(&cdev, &led_gpio_fops);
cdev.owner = THIS_MODULE;
cdev.ops = &led_gpio_fops; result = cdev_add(&cdev, dev, );
if(result){
unregister_chrdev_region(dev, );
printk("Error adding led_gpio.. error no:%d\n",result);
return -EINVAL;
}
led_gpio_class = class_create(THIS_MODULE, DRIVERNAME);
device_create(led_gpio_class, NULL, dev, NULL, DRIVERNAME); printk(DRIVERNAME "initialized"); return ;
} static void __exit LED_exit(void)
{
printk("led chrdev exit!\n");
cdev_del(&cdev);
unregister_chrdev_region(dev, );
device_destroy(led_gpio_class, dev);
class_destroy(led_gpio_class);
} module_init(LED_init);
module_exit(LED_exit);
MODULE_LICENSE("GPL");
API函数:
#ifndef API_LED_H
#define API_LED_H
#include <stdio.h> #ifdef __cplusplus
extern "C" {
#endif int api_led_open(void);
int api_led_close(int fd_led);
int api_led_ioctl(int fd_led, unsigned int pin, unsigned int val); #ifdef __cplusplus
}
#endif #endif
#include "api_led.h"
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h> #define DEVICENAME "/dev/led4" int api_led_open(void)
{
int fd_led;
if((fd_led=open(DEVICENAME,O_RDWR)) <= -){
printf("open device error\n");
return -;
}
return fd_led;
} int api_led_close(int fd_led)
{
if( == close(fd_led))
return ;
else
return -;
} int api_led_ioctl(int fd_led, unsigned int pin, unsigned int val)
{
if(ioctl(fd_led, val, pin) < ){
printf("write error\n");
return -;
}else{
return ;
}
}
应用程序:
/*- test for Lcd12864 -*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "api_led.h"
int main(void)
{
int fd_led;
// int num;
// int ret;
int delay = ; fd_led = api_led_open(); if(fd_led < ){
printf("fd_led open failed!\n");
return -;
} api_led_ioctl(fd_led, , );
api_led_ioctl(fd_led, , ); printf("Hello, Water LEDs run!\n"); while(delay--){
api_led_ioctl(fd_led, , ); // LED IR off
api_led_ioctl(fd_led, , ); // LED HDD on
usleep();
api_led_ioctl(fd_led, , ); // LED HDD off
api_led_ioctl(fd_led, , ); // LED REC on
usleep();
api_led_ioctl(fd_led, , ); // LED REC off
api_led_ioctl(fd_led, , ); // LED IR on
usleep();
// if(count < 0) return -1;
// printf("light LED HDD!\n ")
} api_led_close(fd_led); return ;
}
[DM8168]Linux下控制GPIO实现LED流水灯的更多相关文章
- [DM8168]Linux下控制GPIO控制12864液晶屏(ST7565控制器)
首先加载驱动模块,应用程序通过调用API实现GPIO控制功能. 驱动函数: /* * fileName: st7565_driver.c * just for LCD12864 driver * GP ...
- linux下操作gpio寄存器的方法
一. 在驱动中: 1. 用的时候映射端口:ioremap; #define GPIO_OFT(x) ((x) - 0x56000000) #define GPFCON (*(volatile unsi ...
- Linux 下操作GPIO(两种方法,驱动和mmap)(转载)
目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...
- Linux 下操作gpio(两种方法,驱动和mmap)
目前我所知道的在linux下操作GPIO有两种方法: 1. 编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...
- (转)linux下控制帐户过期的多种方法
linux下控制帐户过期的方法:原文:http://blog.51cto.com/oldboy/1289144企业里一般给无人管理的角色账户或开发人员临时需求等可以设定账户有效期,提升安全!法一:添加 ...
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- 使用CCS10新建TMS320F28335工程并闪烁LED(流水灯)程序
学习TMS320F28335使用Code Composer Studio 10.4.0下载和安装本文不再叙述. 1. 新建工程 1.1选择目录新建工作区 1.2打开软件界面如下图所示: 1.3选择新建 ...
- [转载]嵌入式linux下操作GPIO
本文转自:http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网 ...
随机推荐
- 使用后台程序的第一个表单Form
参考手册:http://www.yiichina.com/doc/guide/2.0/start-forms 1.创建模型:advanced\backend\models\moxing.php 此模型 ...
- js 生成随机数解决缓存的问题
对于缓存有一个解决方法是在链接后添加随机数 例如登陆后跳转到链接/home,但是有缓存上次用户的登陆名,于是在/home后面加上一个随机数 var href = '/home?'+Math.rando ...
- Trie:字典树
简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...
- 【洛谷2152】[SDOI2009] SuperGCD(Python好题)
点此看题面 大致题意: 给你两个长度\(\le10000\)的正整数,让你求它们的\(gcd\). Python 高精请绕道. 这题的正解应该是Python. 对于这种高精题,肯定是Python最方 ...
- Return-to-dl-resolve浅析
本文介绍一种CTF中的高级rop技巧-Return-to-dl-resolve,不久前的0CTF中的babystack和blackhole就用到了这个技巧. 预备知识 在开始本文前希望大家能预先了解一 ...
- 操作系统(2)_进程管理_李善平ppt
所有程序都有CPU和io这两部分,即使没有用户输入也有输出. CPU最好特别忙,io空闲无所谓. 程序/数据/状态 三个维度来看进程. 等待的资源可能是io资源或者通信资源(别的进程的答复). 一个进 ...
- ES6 Proxy拦截器详解
Proxy 拦截器 如有错误,麻烦指正,共同学习 Proxy的原意是"拦截",可以理解为对目标对象的访问和操作之前进行一次拦截.提供了这种机制,所以可以对目标对象进行修改和过滤的操 ...
- yum 安装percona mysql 5.7
Mysql5.7安装准备 1.基础信息: (1)可参考官方文档[https://www.percona.com/doc/percona-server/5.7/installation/yum_repo ...
- nginx负载均衡集群(二)
nginx负载均衡配置实战 一.配置基于域名虚拟主机的web节点 web02和web01做同样的操作,nginx配置文件如下: [root@web01 conf]# cat nginx.conf wo ...
- nginx平滑升级的过程
1.开始之前首先查看当前的使用版本以及编译时的参数: [root@www ~]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.12.2 ...