首先加载驱动模块,应用程序通过调用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流水灯的更多相关文章

  1. [DM8168]Linux下控制GPIO控制12864液晶屏(ST7565控制器)

    首先加载驱动模块,应用程序通过调用API实现GPIO控制功能. 驱动函数: /* * fileName: st7565_driver.c * just for LCD12864 driver * GP ...

  2. linux下操作gpio寄存器的方法

    一. 在驱动中: 1. 用的时候映射端口:ioremap; #define GPIO_OFT(x) ((x) - 0x56000000) #define GPFCON (*(volatile unsi ...

  3. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  4. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

  5. (转)linux下控制帐户过期的多种方法

    linux下控制帐户过期的方法:原文:http://blog.51cto.com/oldboy/1289144企业里一般给无人管理的角色账户或开发人员临时需求等可以设定账户有效期,提升安全!法一:添加 ...

  6. 第一个FPGA工程—LED流水灯

    这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...

  7. S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的

    S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...

  8. 使用CCS10新建TMS320F28335工程并闪烁LED(流水灯)程序

    学习TMS320F28335使用Code Composer Studio 10.4.0下载和安装本文不再叙述. 1. 新建工程 1.1选择目录新建工作区 1.2打开软件界面如下图所示: 1.3选择新建 ...

  9. [转载]嵌入式linux下操作GPIO

    本文转自:http://blog.csdn.net/mirkerson/article/details/8464231 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网 ...

随机推荐

  1. 日常入新坑,py一下

    首先是IDE,因为我经常在Ubuntu 18和win 10两个系统换来换去,所以IDE必须要能跨平台,所以这里就选了PyCharm.Py划重点—— 从Jet Brains的网站下载安装包,直接跟着默认 ...

  2. IOS PickerView使用

    - (void)viewDidLoad { [super viewDidLoad]; // 1.创建pickerview // pickerview有默认的frame UIPickerView *pi ...

  3. 【洛谷2279】[HNOI2003] 消防局的设立(贪心)

    点此看题面 大致题意: 给你\(N\)个点(其中\(1\)号点为根),并告诉你编号为\(2\sim N\)的点的父亲(\(fa[i]<i\)),现在要在树上选择尽量少的关键点(消防局),使得任意 ...

  4. 父子组件通信(vuex的方式)

    转: https://blog.csdn.net/lzh5997/article/details/80407518 父子组件也可以通过vuex的进行来进行中转,其实vuex就类似与一个仓库,父组件把东 ...

  5. 复习C++_基础、函数、数组、字符串

    程序的开发过程 程序 源程序:用源语言写的,有待翻译的程序: 目标程序:源程序通过翻译程序加工以后生成的机器语言程序: 可执行程序:连接目标程序以及库中的某些文件,生成的一个可执行文件,例如Windo ...

  6. python_28_dictionary补充

    #update:合并两个字典,如果有交叉就覆盖更新,没有交叉的就创建 info={ 'stu1101':'Liu Guannan', 'stu1102':'Wang Ruipu', 'stu1103' ...

  7. Oracle11g 主机身份证明问题

    oracle 11g的web database control中,进行一些操作需要主机身份证明,比如进行数据备份.数据的导出导入等;这样对于数据库的安全增强了一定的保证.如果我们有进行适当的配置,可以 ...

  8. java设计模式——单例模式(二)

     破坏单例模式 上一章节,介绍了单例模式的几种方式,这次来学习一波我们创建的单例模式是否安全,能不能破坏.换句话说,也就是在程序运行中,不止有一个实例. 一. 序列化,反序列化破坏 以饿汉式的单例模式 ...

  9. ArrayList集合例题,商品库存管理(集合)

    创建车库集合,存进车 public class demo1 { String pinpai; String c; int s; } import java.util.ArrayList; class ...

  10. hadoop + ssh 配置

    1.输入 2.解决上述问题 3. 4.去掉登陆密码 5.不用密码登陆