/**************************************************************************
* I.MX6 driver goto 使用
* 说明:
* 在绝大多数地方,我们都被告诉尽可能不要用goto,甚至都没学过goto,但
* 这种语法却在内核驱动中普遍使用。
*
* 2016-4-13 深圳 南山平山村 曾剑锋
*************************************************************************/ #include <linux/module.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/miscdevice.h>
#include <linux/delay.h> #define SABRESD_VO_PIN IMX_GPIO_NR(1, 4)
#define SABRESD_AMPE_PIN IMX_GPIO_NR(1, 5)
#define SABRESD_SD_PIN IMX_GPIO_NR(1, 19)
#define SABRESD_DT_PIN IMX_GPIO_NR(3, 20) #define SPK_HEIGHT 66
#define SPK_LOW 67
#define AMP_HEIGHT 68
#define AMP_LOW 69
#define SD_HEIGHT 70
#define SD_LOW 71
#define DETECT 72 #define GPIO_CTRL_DEBUG
#ifdef GPIO_CTRL_DEBUG
#define mDebug(format, ...) printk("File:%s, Function:%s, Line:%d "format, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define mDebug(format, ...)
#endif static int gpioCtrl_open(struct inode *inode, struct file *file)
{
mDebug("Dev open.\n"); return ;
} static int gpioCtrl_close(struct inode *inode, struct file *file)
{
mDebug("Dev close.\n"); return ;
} static ssize_t gpioCtrl_read(struct file *file,
char __user *buf,
size_t count,
loff_t *pos)
{
mDebug("Read data.\n"); return ;
} static long gpioCtrl_ioctl(struct file * file, unsigned int cmd, unsigned long arg) { int ret = ; switch ( cmd ) {
case SPK_HEIGHT :
gpio_set_value(SABRESD_VO_PIN, );
mDebug("SPK_HEIGHT.\n");
break;
case SPK_LOW :
gpio_set_value(SABRESD_VO_PIN, );
mDebug("SPK_LOW.\n");
break;
case AMP_HEIGHT :
gpio_set_value(SABRESD_AMPE_PIN, );
mDebug("AMP_HEIGHT.\n");
break;
case AMP_LOW :
gpio_set_value(SABRESD_AMPE_PIN, );
mDebug("AMP_LOW.\n");
break;
case SD_HEIGHT :
gpio_set_value(SABRESD_SD_PIN, );
mDebug("SD_HEIGHT.\n");
break;
case SD_LOW :
gpio_set_value(SABRESD_SD_PIN, );
mDebug("SD_LOW.\n");
break;
case DETECT :
ret = gpio_get_value(SABRESD_DT_PIN);
(*(int *)arg) = ret;
mDebug("DETECT ret = %d.\n", ret); ret = ;
break;
default :
mDebug("gpioCtrl control error.\n");
ret = -;
break;
}
return ret;
} struct file_operations fops = {
.owner = THIS_MODULE,
.open = gpioCtrl_open,
.release = gpioCtrl_close,
.read = gpioCtrl_read,
.unlocked_ioctl = gpioCtrl_ioctl,
}; struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = "gpioCtrl",
.fops = &fops,
}; int __init gpioCtrl_init(void)
{
int ret; ret = gpio_request(SABRESD_VO_PIN, "SABRESD_VO_PIN");
if ( ret ) {
mDebug("get SABRESD_VO_PIN gpio FAILED!\n");
return ret;
} ret = gpio_request(SABRESD_AMPE_PIN, "SABRESD_AMPE_PIN");
if ( ret ) {
mDebug("get SABRESD_AMPE_PIN gpio FAILED!\n");
goto fail1;
} ret = gpio_request(SABRESD_SD_PIN, "SABRESD_SD_PIN");
if ( ret ) {
mDebug("get SABRESD_SD_PIN gpio FAILED!\n");
goto fail2;
} ret = gpio_request(SABRESD_DT_PIN, "SABRESD_DT_PIN");
if ( ret ) {
mDebug("get SABRESD_DETECT gpio FAILED!\n");
goto fail3;
} gpio_direction_output(SABRESD_VO_PIN, );
gpio_direction_output(SABRESD_AMPE_PIN, );
gpio_direction_output(SABRESD_SD_PIN, );
gpio_direction_input(SABRESD_DT_PIN); ret = misc_register(&misc);
if(ret) {
mDebug("gpioCtrl_misc_register FAILED!\n");
goto fail4;
} mDebug("gpioCtrl_misc_register over!\n");
return ret; fail4:
gpio_free(SABRESD_DT_PIN);
fail3:
gpio_free(SABRESD_SD_PIN);
fail2:
gpio_free(SABRESD_AMPE_PIN);
fail1:
gpio_free(SABRESD_VO_PIN); return ret;
} void __exit gpioCtrl_exit(void)
{
gpio_set_value(SABRESD_VO_PIN, );
gpio_set_value(SABRESD_AMPE_PIN, );
gpio_set_value(SABRESD_SD_PIN, ); gpio_free(SABRESD_VO_PIN);
gpio_free(SABRESD_AMPE_PIN);
gpio_free(SABRESD_SD_PIN);
gpio_free(SABRESD_DT_PIN); misc_deregister(&misc);
} module_init(gpioCtrl_init);
module_exit(gpioCtrl_exit); MODULE_LICENSE("GPL");

I.MX6 driver goto 使用的更多相关文章

  1. linux kernel下输入输出console怎样实现

    近期工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台. 利用这个机会,学习下printk怎样选择往哪个console输出以及user空间下控制台怎样选择. ...

  2. web自动化测试:watir+minitest(二)

    环境搭建: 我已经安装了一台全新的win7虚拟机.下面将开始搭建watir环境. 安装包清单. 安装ruby.执行rubyinstaller-2.2.4-x64.exe 选择语言: 勾选添加到环境变量 ...

  3. linux kernel下输入输出console如何实现【转】

    转自:https://blog.csdn.net/skyflying2012/article/details/41078349 最近工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及u ...

  4. 深入linux kernel内核配置选项

    ============================================================================== 深入linux kernel内核配置选项 ...

  5. I.MX6 gpio-keys driver hacking

    /**************************************************************************** * I.MX6 gpio-keys driv ...

  6. I.MX6 bq27441 driver hacking

    /************************************************************************* * I.MX6 bq27441 driver ha ...

  7. I.MX6 ar1020 SPI device driver hacking

    /************************************************************************************ * I.MX6 ar1020 ...

  8. I.MX6 Linux I2C device& driver hacking

    /******************************************************************************************* * I.MX6 ...

  9. I.MX6 PWM buzzer driver hacking with Demo test

    /***************************************************************************** * I.MX6 PWM buzzer dr ...

随机推荐

  1. Huawei HG556a A版 刷 openwrt

    一直想玩玩openwrt,调研了一下 HG556a尽管散热很烂,但性价比超高,于是淘宝入手一台A版,A版和C版区别为wifi芯片: 到货后在网上找了几个教程便开始动手刷openwrt,但刷机的过程中还 ...

  2. (转)linux性能优化总结

    感谢博客http://sillycat.iteye.com提供的资料 linux性能检查(一)介绍和CPU 通常监控的子系统有: CPU Memory IO Network 应用类型 IO相关,处理大 ...

  3. WPF中的多点触摸事件

    UIElement在WPF4下添加了很多支持多点触摸的事件,通过它们可以在硬件支持的情况下处理多点触摸,以下通过代码来说明通过处理这些事件,我们可以做些什么: 一.触摸相关的多种事件,跟鼠标事件是对应 ...

  4. oracle中的dual表详解

    oracle中的dual表详解 1.DUAL表的用途 Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中 --查看当前连接用户 SQL> s ...

  5. php生成xml的四种方法(转)

    <?xml version="1.0" encoding="utf-8"?> <article> <item> <ti ...

  6. HelloWorld和数据绑定

    HelloWorld和数据绑定 目录导读: AngularJS 系列 学习笔记 目录篇 前言: 好记性不如烂键盘,随笔就是随手笔记,希望以后有用. 本篇目录: 1. Hello World 2. An ...

  7. python学习笔记3(字符串)

    Python字符串: 在Python中的字符串被确定为一组连续的字符在引号之间, Python允许在任何对单引号或双引号. 串的子集,可以使用切片操作符可采用([]和[:]),索引从0开始的字符串的开 ...

  8. IOS调用相机相册

    #import "SendViewController.h"  //只能打开,没有加载图片的代码,老代码,供参考 #import <MobileCoreServices/UT ...

  9. iOS工程中的info.plist文件

    我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载 ...

  10. 实时数据处理环境搭建flume+kafka+storm:0.环境依赖

    storm需要java和Python  部署依赖环境 --- 要求Java 6+ .Python 2.6.6+   java,python安装配置完成