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 ...
随机推荐
- Beaglebone Back学习三(开发环境搭建)
开发环境搭建 1 Ubuntu环境搭建 2 Window环境搭建 3 开发板环境搭建 1 Ubuntu环境搭建 (1)安装必要的网络工具 samba nfs tftp vmware-tools sam ...
- wpf鼠标捕获与控件交互——UIElement.CaptureMouse
应用场景是这样的,我需要拖动一个元素在屏幕上移动,注册了被移动元素的MouseMove事件,但是当鼠标移到被移动元素的外面时,移动失效,且鼠标的手势变成了普通的箭头形状,于是就找到了以下的解决方案. ...
- .NET中的弱引用
弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat cat = new Cat(); 变量cat就 ...
- 安装Ubuntu时,遇到自定义交换空间swap大小设置问题
【整理】Ubuntu自定义分区设置 在安装Ubuntu时,如果使用的是一个新硬盘那么安装向导会建议你使用整个硬盘,如果硬盘上已经有数据了,向导会建议使用剩余的空间。不管怎样,是由向导自动划分的分区。 ...
- Could not retrieve mirrorlist http://mirrorlist.centos.org || PYCURL ERROR 6
yum:Could not retrieve mirrorlist http://mirrorlist.centos.org || PYCURL ERROR 6 通过centos安装openldap的 ...
- RedHat6.4 用UDEV配置ASM所需磁盘
同事在装一套RAC测试环境,结果发现原来用ASMLIB来配置磁盘,在安装GRID的时候,最终报错了,经过检查发现居然两边的磁盘不匹配.A机的sdb,sdc分别对应OCRVOL1,OCRVOL2,但是B ...
- UINavigationController 总结
一 . UINavigationBar 1.获取 UINavigationBar 对象: [UINavigationBar appearance] ,可以通过该方法对全部 navigation 进行设 ...
- 2329: [HNOI2011]括号修复 - BZOJ
恶心的splay,打标记的时候还有冲突,要特别小心 上次写完了,查了半天没查出错来,于是放弃 今天对着标程打代码,终于抄完了,我已经不想再写了 const maxn=; type node=recor ...
- 6779. Can you answer these queries VII - SPOJ
Given a tree with N ( N<=100000 ) nodes. Each node has a interger value x_i ( |x_i|<=10000 ). ...
- [转载]Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux
代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大.灵活的编辑器,相信你和我一样,都不会例外. 我用过 ...