I.MX6 driver goto 使用
/**************************************************************************
* 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 使用的更多相关文章
- linux kernel下输入输出console怎样实现
近期工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及user空间的输入输出控制台. 利用这个机会,学习下printk怎样选择往哪个console输出以及user空间下控制台怎样选择. ...
- web自动化测试:watir+minitest(二)
环境搭建: 我已经安装了一台全新的win7虚拟机.下面将开始搭建watir环境. 安装包清单. 安装ruby.执行rubyinstaller-2.2.4-x64.exe 选择语言: 勾选添加到环境变量 ...
- linux kernel下输入输出console如何实现【转】
转自:https://blog.csdn.net/skyflying2012/article/details/41078349 最近工作在调试usb虚拟串口,让其作为kernel启动的调试串口,以及u ...
- 深入linux kernel内核配置选项
============================================================================== 深入linux kernel内核配置选项 ...
- I.MX6 gpio-keys driver hacking
/**************************************************************************** * I.MX6 gpio-keys driv ...
- I.MX6 bq27441 driver hacking
/************************************************************************* * I.MX6 bq27441 driver ha ...
- I.MX6 ar1020 SPI device driver hacking
/************************************************************************************ * I.MX6 ar1020 ...
- I.MX6 Linux I2C device& driver hacking
/******************************************************************************************* * I.MX6 ...
- I.MX6 PWM buzzer driver hacking with Demo test
/***************************************************************************** * I.MX6 PWM buzzer dr ...
随机推荐
- jQuery基础与实例
一.简介 1.什么是jQuery jQuery是一个轻量级.快速简洁的javaScript库,能让我们方便快捷的选择元素操作元素属性. 2.下载地址 3.jQuery使用方式 $("div& ...
- 自学JAVA总结
2.在定义常量的时候C语言中定义为const而JAVA中为final3.在JAVA声明成员变量的时候,使用static来定义.4.在JAVA中的boolean类型只包括true和false,但是在C中 ...
- sql查找最小缺失值与重用被删除的键(转载)
转载自:http://blog.csdn.net/yanghua_kobe/article/details/6262550 在数据处理时,我们经常会使用一些“自增”的插入方式来处理数据.比如学生学号: ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- tablib源代码学习
tablib简介 ----------- Tablib is a format-agnostic tabular dataset library, written in Python. Tablib ...
- Hadoop1.0.3集成eclipse开发
本文来自:http://www.ilablog.org/%E7%BC%96%E8%AF%91hadoop-eclipse%E6%8F%92%E4%BB%B6/ 本人由于工作原因目前没有亲自尝试,那位尝 ...
- sb 讲解 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
代码:(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] 输出sb. 分段解析: 首先解析s: (! ...
- ParentChildTest.java
public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); ...
- java中线程池的使用方法
1 引入线程池的原因 由于线程的生命周期中包括创建.就绪.运行.阻塞.销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建.销毁线程需要很大的 ...
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...