首先加载驱动模块,应用程序通过调用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. c++树的表示方法

    c++树的节点的表示方法: typedef struct Node *Tree; struct Node { int data; Node *left; Node *right; int flag; ...

  2. Python http

    # import httplib # http_client = None # http_client = httplib.HTTPConnection('localhost', 8080, time ...

  3. iOS界面设计切图小结

    iOS界面设计切图小结 APR 12TH, 2013 1.基本尺寸 (1)界面 实际设计时按: iPhone4.4s:640px*960px iPhone5: 640px*1136px iPad:15 ...

  4. 题解 P2626 【斐波那契数列(升级版)】

    这道题,大家一定要注意: 要对2^31取模 ! ( 本蒟蒻开始没注意到这一点,WA了 ) (不过大家在试样例的时候,试试47,出不了结果,就说明你没模2^31) 总体来说,这道题考查的知识点就两个: ...

  5. ETL工具--DataX3.0实战

    DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换,由淘宝数据平台部门完成. DataX ...

  6. CentOS6.5-DHCP配置

    原文链接主机配置: 1.查看主机名:hostname 2.修改主机名:vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=master.303kfy.n ...

  7. Linux学习记录(三)

    1.Linux的软件安装 1.1.jdk安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | g ...

  8. iOS进阶面试题

    1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ // https://github. ...

  9. list变set去重,set交集

    set 取交集 并集 删除没有的元素  不会报错 remove 会报错 https://www.cnblogs.com/alex3714/articles/5717620.html

  10. MSBuild常用方法

    打包后把nuget包复制到指定的目录 <Target Name="CopyPackage" AfterTargets="Pack"> <Cop ...