全志A20控制GPIO口的一种方法:_南棱笑笑生的博客-程序员ITS203

技术标签: 全志  

全志A20控制GPIO口的一种方法:




1、驱动模块文件:a20_gpio.c
// printk(KERN_ERR "****wyb %s:%d/%s()!\n", __FILE__, __LINE__, __func__);


// http://blog.csdn.net/mirkerson/article/details/8844997
// android驱动学习---gpio实验 


#include <linux/module.h>               /* For module specific items */  
#include <linux/moduleparam.h>          /* For new moduleparam's */  
#include <linux/types.h>                /* For standard types (like size_t) */  
#include <linux/errno.h>                /* For the -ENODEV/... values */  
#include <linux/kernel.h>               /* For printk/panic/... */  
#include <linux/fs.h>                   /* For file operations */ 
#include <linux/ioport.h>               /* For io-port access */  
#include <linux/platform_device.h>      /* For platform_driver framework */  
#include <linux/init.h>                 /* For __init/__exit/... */  
#include <linux/uaccess.h>              /* For copy_to_user/put_user/... */  
#include <linux/io.h>                   /* For inb/outb/... */  
#include <linux/gpio.h>  
#include <linux/device.h>  
#include <linux/cdev.h>  
#include <linux/slab.h>               /*kamlloc */  




 


static int  major = 219;  
static struct class *gpio_class;


struct cdev_gpio {  
struct cdev cdev;  
}; //建议用2.6的注册方法,2.4的已经离我们越来越远了。  
struct cdev_gpio *gpio_dev;  


static long gpio_ioctl(struct file* filp, unsigned int cmd, unsigned long argv)  
{
// printk("****wyb %s:%d/%s()! cmd=0x%08x\n", __FILE__, __LINE__, __func__, cmd);

unsigned char ucGPIONumber = (cmd & 0x0000FF00) >> 8;

// printk("****wyb %s:%d/%s()! cmd=0x%08x ucGPIONumber=0x%08x, %d\n", __FILE__, __LINE__, __func__, cmd, ucGPIONumber, ucGPIONumber);
printk(KERN_ERR "****wyb %s:%d/%s()! cmd=0x%08x ucGPIONumber=0x%08x, %d\n", __FILE__, __LINE__, __func__, cmd, ucGPIONumber, ucGPIONumber);

if( cmd > (0x00840000-1) )
{
gpio_direction_output( ucGPIONumber, 1);
}
else
{
gpio_direction_output( ucGPIONumber, 0);
}

printk(KERN_ERR "----wyb %s:%d/%s()! end!!!!\n", __FILE__, __LINE__, __func__);

return 0;  
}  




//open  
static int gpio_open(struct inode* i_node, struct file* filp)  
{
printk(KERN_ERR "****wyb %s:%d/%s()! open init....\n", __FILE__, __LINE__, __func__);


return 0;  
}  


//close 
static int gpio_close(struct inode* i_node, struct file* filp)  
{
printk(KERN_ERR "****wyb %s:%d/%s()! close init\n", __FILE__, __LINE__, __func__);

return 0;  
}  


/* file operations */  
struct file_operations gpio_fops={  
.owner  = THIS_MODULE,  
.open   = gpio_open,  
.unlocked_ioctl = gpio_ioctl, // 特别注意从2.6.36以后ioctl已经移除,内核里面用unlocked_ioctl和compat_ioctl. 应用层不变,仍是ioctl调用。  
.release= gpio_close,  
};  


static int __init gpio_init(void)  
{
dev_t dev_no;  
int result, err;

printk(KERN_ERR "****wyb %s:%d/%s()! init ....\n", __FILE__, __LINE__, __func__);

err = alloc_chrdev_region(&dev_no, 0, 1, "a20_gpio"); //动态申请设备号  
if(err<0)  
{  
printk(KERN_INFO "ERROR\n");


return err;  
}  


major = MAJOR(dev_no);  
gpio_dev = kmalloc(sizeof(struct cdev_gpio), GFP_KERNEL);  


if(!gpio_dev)  
{  
result = -ENOMEM;


goto fail_malloc;  



memset(gpio_dev, 0, sizeof(gpio_dev));  


cdev_init(&gpio_dev->cdev,&gpio_fops); // 初始化cdev  
gpio_dev->cdev.owner = THIS_MODULE;  
result = cdev_add(&gpio_dev->cdev, dev_no, 1); //加载设备  


if(result <0)  
{
printk(KERN_INFO "error\n");  


goto fail_add;  
}  


gpio_class = class_create(THIS_MODULE, "a20_gpio");  //在sys/class下创建sysfs文件  
device_create(gpio_class, NULL, MKDEV(major, 0), NULL, "a20_gpio"); //动态创建设备文件  /dev/mygpio, 以后不用手动创建了

printk(KERN_ERR "----wyb %s:%d/%s()! err=%d, result=%d\n", __FILE__, __LINE__, __func__, err, result);


return 0;  

fail_add:  
kfree(gpio_dev);  
fail_malloc:  
unregister_chrdev_region(dev_no, 1); 


return result;
}  


static void __exit gpio_exit(void)  
{  
printk(KERN_ERR "****wyb %s:%d/%s()!\n", __FILE__, __LINE__, __func__);

dev_t dev_no=MKDEV(major, 0);  


unregister_chrdev_region(dev_no, 1);  
cdev_del(&gpio_dev->cdev);  
kfree(gpio_dev);  

device_destroy(gpio_class, dev_no);  
class_destroy(gpio_class);

printk(KERN_ERR "----wyb %s:%d/%s()!\n", __FILE__, __LINE__, __func__);
}


module_init(gpio_init);
module_exit(gpio_exit);


MODULE_AUTHOR("koliy <[email protected]>");  
MODULE_DESCRIPTION("ARM test gpio");  
MODULE_LICENSE("GPL");  










2、驱动模块文件:Makefile( 请严重注意绝对路径的写法
#
# gpio drirvers
#
PWD :=$(shell pwd)
KERNELDIR := /home/rootroot/wyb/marsboard_hdmi_video1_csi1_ov7670/marsboard_only_ov7670_720p/lichee/linux-3.3
ANDROIDDIR := /home/rootroot/wyb/marsboard_hdmi_video1_csi1_ov7670/marsboard_only_ov7670_720p/android4.2



ARCH=arm


CROSS_COMPILE = $(ANDROIDDIR)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-


CC=$(CROSS_COMPILE)gcc


LD=$(CROSS_COMPILE)ld


obj-m += a20_gpio.o


modules:
$(MAKE) -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules

clean:    
make -C $(KERNELDIR) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) clean








3、APP程序:setgpio.c
// http://blog.csdn.net/21cnbao/article/details/7919055


#include <stdio.h>  
#include <linux/types.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/ioctl.h>  
#include <errno.h>  
#include <assert.h>  
#include <string.h>  
#include <linux/i2c.h>  








int fd;








int main(int argc, char **argv)
{
unsigned int uiSetGPIO = 0;

// fd = open("/dev/gpioset_imx6q", O_RDWR);
fd = open("/dev/a20_gpio", O_RDWR);

// ioctl(fd, 0x00940000, 0);
if(argc>1)
{
sscanf(argv[1], "%x", &uiSetGPIO);

ioctl(fd, uiSetGPIO, 0);
}
// else
// {
// printf("**** wyb f:%s l:%d f:%s !!!!no Parameters\n", __FILE__, __LINE__, __func__);
//
// ioctl(fd, 0x00940001, 0);
// }

close(fd);


return 0;  
}








4、APP程序:Android.mk
LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE_TAGS := optional


LOCAL_MODULE = setgpio


# LOCAL_SRC_FILES := $(call all-subdir-c-files)
LOCAL_SRC_FILES := setgpio.c


include $(BUILD_EXECUTABLE)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wb4916/article/details/53836058

智能推荐

MUI框架-04-切换页面头部文字重叠(已解决)_肖朋伟的博客-程序员ITS203

MUI框架-04-切换页面头部文字重叠从现在开始就只分享 MUI 框架开发时遇到的问题了开发不懂请查看:官方文档问题情况切换页面title文字重叠,覆盖截图:解决办法给标签加背景色方法很土效果很好截图:效果预览完美解决截图:更多文章链接:MUI 框架 - 本笔记不允许任何个人和组织转载...

Python3 安装Crypto模块_拉灯的小手的博客-程序员ITS203_python 安装crypto

本文仅供学习交流使用,如侵立删!联系方式及demo下载见文末安装Crypto模块pip install pycryptodome本文仅供学习交流使用,如侵立删!企鹅 、WX: 1033383881(备注来意)

fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”_martian665的博客-程序员ITS203

现象:    vs2010编译时报错:错误 8    error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include &quot;StdAfx.h&quot;”?    f:\test-dev\imagetest_clublic\imagetest\imagetest.cpp    158解决方法:解决办法,找到出错的.cpp或者.h我这里是:imagetest....

进程线程实验_mouren丶的博客-程序员ITS203

西安邮电大学(计算机学院)课内实验报告实验名称:进程线程实验专业名称:计算机科学与技术班级:计科1503学生姓名:黎涛学号(8位): 04151078指导教师:陈莉君实验日期:2017年4月12 日~2017年4月20日...

mybatis查询oracle数据丢失,mybatis使用char查询oracle时返回null 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题..._交易员.Coder的博客-程序员ITS203

同事在学mybatis时,遇到了一个问题就是,使用char类型字段作为查询条件时一直都查不出数据,其他类型的则可以。使用的数据库是oracle,查询条件字段类型是char(50),java代码对应的是String类型。后来经过排查,是由于在oracle中,char类型字段,如果内容长度不够,会自动以空格方式补足长度。如字段 name char(5),若值为sgl,那么oracle会自动用空格补足长...

oracle 使用序列效率,oracle使用profiler分析语句执行效率_weixin_39997695的博客-程序员ITS203

1、前言Profiler是ORACLE PL/SQL 的一个调试优化跟踪方案,使用profiler可以跟语句执行过程中消耗的时间等。在日常开发过程中,我们可能会常常遇到一些sql语句、存储过程在使用过程中,消耗过多的资源,为了细化了某条具体的语句,我们可以使用profiler。这样大大的减少了我们寻找问题语句的时间,提高效率,在优化的过程中,profiler起到一个很好的效果2、profiler的...

随便推点

php说说系统,PHP+mysql+jQuery说说留言板_weixin_39680208的博客-程序员ITS203

这个说说功能是我最早参考钱包网来制作的,现在该网站已经没有这功能了。后来被我应用到订餐网站了,需要订餐源码的联系我,2000元整站功能,带多店铺订餐、留言、抽奖、和后台管理。下载资源下载积分:260积分首先遍历最顶级说说和下级说说。 SESSION_START();include_once("connect.php");include_once("function.p...

鹰眼Android平台崩溃监控实践_清流_46837673的博客-程序员ITS203

在移动应用开发及应用发布阶段经常碰到应用崩溃的情况。对于开发阶段出现的崩溃,开发者可以从后台日志中获取崩溃堆栈进行分析;而线上出现的崩溃,开发者看不到后台日志,难以获取崩溃堆栈。这就需要一款可以监控线上应用崩溃情况的工具,当应用出现崩溃时及时收集堆栈信息进行分析,然后上报给服务端,开发者就可以在控制台实时了解应用的崩溃情况。为了满足监控移动端线上崩溃的需求,我们打造了鹰眼监控系统。鹰眼支持iOS、...

将一台及多台服务器操作日志发送至中央日志服务器_告辞啥都不会的博客-程序员ITS203_服务器日志发送给日志服务器

1.首先确定client服务器定义info,error,debug级别日志,并发送到日志服务器上,在下列位置插入vim /etc/rsyslog# Save boot messages also to boot.loglocal7.* /var/log/boot.log*.info @xxx.xxx.xxx.xxx #此行为添加行(xxx代表

基于token认证原理是怎样的?_fly_zhaohy的博客-程序员ITS203_token认证原理

它的交互流程是,用户认证成功后,服务端生成一个token发给客户端,客户端可以放到 cookie 或 localStorage等存储中,每次请求时带上 token,服务端收到token通过验证后即可确认用户身份。...

ICMP 使用wireshark抓包_LZLsunny的博客-程序员ITS203_icmp抓包

目录ICMP使用Wireshark抓包。ICMPIP协议的助手 —— ICMP 协议ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。关键词 —— 控制网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。ICMP 功能:ICMP 主要的功能包括:确认 IP 包是否成功送达目标地

推荐文章

热门文章

相关标签