转:全志A20 GPIO 总结文档
链接:
http://blog.csdn.net/chwenj/article/details/42190745
- /*
- * author: chwenj@gmail.com.
- * Agreement: GPL.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define GPIO_SET 0xAC
- #define GPIO_GET 0xAB
- #define DEVICE_FILE "/dev/gpio_cdev"
- typedef struct {
- unsigned char count; //GPIO序列
- unsigned char data; //GPIO电平状态
- } gpio_userspace_t;
- /*main*/
- int main(/* int argc, char **argv */)
- {
- /*open*/
- int gpio_fd, ret;
- gpio_fd = open(DEVICE_FILE, O_RDWR); //读写权限打开文件
- if (gpio_fd < 0) {
- printf("gpio device fail to open.\n");
- return -1;
- }
- printf("%s opend.\n", DEVICE_FILE);
- #if 1
- /*write*/
- gpio_userspace_t write_gpio;
- write_gpio.count = 5; //GPIO序列号
- write_gpio.data = 1; //GPIO电平值
- printf("write: count = %d , data = %d.\n", write_gpio.count, write_gpio.data);
- ret = write(gpio_fd, &write_gpio, sizeof(gpio_userspace_t));
- if (ret < 0) {
- printf("%s fail to write.\n", DEVICE_FILE);
- return -1;
- }
- #endif
- /*ioctl*/
- gpio_userspace_t ioctl_gpio;
- ioctl_gpio.data = 0xff; //level:0xff
- ioctl_gpio.count = 5; //pin:4
- ret = ioctl(gpio_fd, GPIO_SET, &ioctl_gpio);
- if (ret < 0) {
- printf("ioctl: ioctl fail.\n");
- return -1;
- }
- /*read*/
- gpio_userspace_t read_gpio;
- ret = read(gpio_fd, &read_gpio, sizeof(gpio_userspace_t));
- if (ret < 0) {
- printf("read: fail to read.\n");
- return -1;
- }
- printf("read: count = %d, data = %d.\n", read_gpio.count, read_gpio.data);
- /*close*/
- close(gpio_fd);
- printf("%s close.\n", DEVICE_FILE);
- return 0;
- }
- #include <linux/fs.h>
- #include <linux/types.h>
- #include <linux/module.h>
- #include <linux/errno.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/cdev.h>
- #include <linux/platform_device.h>
- #include <linux/utsname.h>
- #include <asm/uaccess.h>
- #include <asm/io.h>
- #include <mach/sys_config.h>
- #include <mach/includes.h>
- #include <linux/gpio.h>
- #include <linux/delay.h>
- /**********************************************************/
- #define GPIO_SET 0xAC
- #define GPIO_GET 0xAB
- /**********************************************************/
- script_item_u *gpio_list = NULL;
- //gpio_userspace_t 和 gpio_pdata_t 在序列上是一一对应的关系.
- typedef struct {
- unsigned char count; //IO序列:0,1,2,..., 19.
- unsigned char data; //IO电平.
- } gpio_userspace_t;
- typedef struct {
- struct gpio_config gpio;
- char gpio_name[32];
- int gpio_cnt;
- } gpio_pdata_t;
- typedef struct {
- //debug tag for printk
- #define __DEBUG_TAG__
- #ifdef __DEBUG_TAG__
- #define dprintk(fmt, arg...) printk(fmt, ## arg)
- #else
- #define dprintk(fmt, arg...)
- #endif
- //char device name: /dev/gpio_cdev
- #define DEVICE_NAME "gpio_cdev"
- //multiple
- #define MUL_SEL_INPUT 0
- #define MUL_SEL_OUTPUT 1
- //char device
- struct cdev *gpio_cdev;
- dev_t devid;
- struct class *gpio_class;
- //gpio count
- int gpio_cnt;
- //general gpio subsystem
- gpio_pdata_t pin[20];
- //
- } gpio_info_t;
- static gpio_info_t info;
- //global gpio pin record:
- char pin_count;
- /**********************************************************/
- static int gpio_cdev_open(struct inode *inode, struct file *file)
- {
- dprintk("[gpio]: gpio_cdev_open fn.\n");
- <span style="white-space:pre"> </span>return 0;
- }
- static int gpio_cdev_release(struct inode *inode, struct file *file)
- {
- dprintk("[gpio]: gpio_cdev_release fn.\n");
- <span style="white-space:pre"> </span>return 0;
- }
- /**********************************************************/
- //write
- static ssize_t gpio_cdev_write(struct file *file, const char __user *buf, \
- size_t count, loff_t *ppos)
- {
- gpio_userspace_t write_gpio;
- unsigned char write_data, write_count;
- dprintk("[gpio]: gpio_cdev_write fn.\n");
- copy_from_user(&write_gpio, (gpio_userspace_t *)buf, sizeof(gpio_userspace_t));
- write_data = write_gpio.data;
- write_count = write_gpio.count;
- dprintk("[gpio][write]: data=%d, count=%d.\n", write_data, write_count);
- //error correction.
- if ((write_data != 0) && (write_data != 1)) {
- dprintk("[gpio][write][error]: write_data invalid.\n");
- }
- if ((write_count < 0) || (write_count >19)) {
- dprintk("[gpio][write][error]: write_count does not exit.\n");
- }
- gpio_direction_output(info.pin[write_count].gpio.gpio, write_data);
- //mdelay(1);
- return 0;
- }
- //read
- static ssize_t gpio_cdev_read(struct file *file, char __user *buf, \
- size_t count, loff_t *ppos)
- {
- int i;
- unsigned char data;
- unsigned int gpio;
- gpio_userspace_t read_gpio;
- dprintk("[gpio]: gpio_cdev_read fn.\n");
- #if 0
- gpio_userspace_t read_gpio[20];
- for (i = 0; i < 20; i++) {
- gpio = info.pin[i].gpio.gpio;
- //调试用;不要轻易打开:
- #if 0
- if(0 != gpio_direction_input(gpio)) {
- dprintk("set to input failed.\n");
- continue;
- }
- #endif
- data = __gpio_get_value(gpio);
- read_gpio[i].count = i;
- read_gpio[i].data = data;
- dprintk("[gpio][read]: pin_%d = %d.\n", read_gpio[i].count, read_gpio[i].data);
- }
- copy_to_user(buf, read_gpio, 20*sizeof(gpio_userspace_t));
- #else
- i = pin_count;
- dprintk("[gpio][read]: pin_count = %d.\n", i);
- gpio = info.pin[i].gpio.gpio;
- data = __gpio_get_value(gpio);
- read_gpio.count = i;
- read_gpio.data = data;
- dprintk("[gpio][read]: count = %d; data = %d.\n", read_gpio.count, read_gpio.data);
- copy_to_user(buf, &read_gpio, sizeof(gpio_userspace_t));
- #endif
- return 0;
- }
- static long gpio_cdev_ioctl(struct file *file, unsigned int cmd, \
- unsigned long arg)
- {
- dprintk("[gpio]: gpio_cdev_ioctl fn;");
- dprintk(" cmd = %d.\n", cmd);
- void __user *uarg;
- uarg = (void __user *)arg;
- gpio_userspace_t ioctl_gpio;
- copy_from_user(&ioctl_gpio, (gpio_userspace_t *)uarg, sizeof(gpio_userspace_t));
- dprintk("[gpio]:count = %d, data = %d.\n", ioctl_gpio.count, ioctl_gpio.data);
- switch(cmd) {
- case GPIO_SET:
- dprintk("[gpio]: ioctl cmd = GPIO_SET.\n");
- pin_count = ioctl_gpio.count;
- dprintk("[gpio]: pin_count = %d.\n", pin_count);
- if ((pin_count > 19)|| (pin_count < 0)) {
- dprintk("[gpio][error]: gpio_cdev_ioctl: pin_count invalide.\n");
- }
- break;
- case GPIO_GET:
- dprintk("[gpio]: ioctl cmd = GPIO_SET.\n");
- break;
- default:
- dprintk("[gpio]: ioctl cmd = default.\n");
- break;
- }
- return 0;
- }
- static const struct file_operations gpio_cdev_fops = {
- .owner = THIS_MODULE,
- .open = gpio_cdev_open,
- .release = gpio_cdev_release,
- .write = gpio_cdev_write,
- .read = gpio_cdev_read,
- .unlocked_ioctl = gpio_cdev_ioctl,
- };
- static int gpio_fetch_config(void)
- {
- char buffer[32] = {};
- int i;
- int cnt = info.gpio_cnt;
- script_item_value_type_e type;
- script_item_u val;
- dprintk("[gpio]: gpio_fetch_config fn.\n");
- dprintk("[gpio]: gpio_cnt=%d.\n", cnt);
- dprintk("--------------------\n");
- for(i=0; i< cnt; i++) {
- //format sprintf
- sprintf(buffer, "gpio_pin_%d", i);
- dprintk("[gpio]: buffer=%s.\n", buffer);
- //fetch gpio_pin_# issue
- type = script_get_item("gpio_para", buffer, &val);
- if (SCIRPT_ITEM_VALUE_TYPE_PIO != type) {
- dprintk("[gpio]: item value type INVALID.\n");
- return -1;
- }
- else {
- info.pin[i].gpio.gpio = val.gpio.gpio;
- info.pin[i].gpio.mul_sel = val.gpio.mul_sel;
- dprintk("[gpio][pin%d]: gpio=%d, mul_sel=%d, ", i, info.pin[i].gpio.gpio, info.pin[i].gpio.mul_sel);
- strcpy(info.pin[i].gpio_name, buffer);
- dprintk("name=%s, ", info.pin[i].gpio_name);
- info.pin[i].gpio_cnt = i;
- dprintk("gpio_cnt=%d.\n", info.pin[i].gpio_cnt);
- dprintk("--------------------\n");
- }
- }
- dprintk("[gpio]: success to gpio_fetch_config.\n");
- return 0;
- }
- static int __init gpio_module_init(void)
- {
- int ret = 0, err;
- int cnt = 0, i;
- script_item_value_type_e type;
- script_item_u val;
- dprintk("[gpio]: gpio_module_init fn.\n");
- ret = alloc_chrdev_region(&(info.devid), 0, 20, DEVICE_NAME);
- if ( ret ) {
- dprintk("[gpio]: fail to alloc_chrdev_region.\n");
- return -1;
- }
- dprintk("[gpio]: devid major=%d, minor=%d.\n", MAJOR(info.devid), MINOR(info.devid));
- info.gpio_cdev = cdev_alloc();
- cdev_init(info.gpio_cdev, &gpio_cdev_fops);
- info.gpio_cdev->owner = THIS_MODULE;
- err = cdev_add(info.gpio_cdev, info.devid, 1);
- if (err) {
- dprintk("[gpio]: cdev_add fail.\n");
- return -1;
- }
- info.gpio_class = class_create(THIS_MODULE, DEVICE_NAME);
- if (IS_ERR(info.gpio_class)) {
- dprintk("[gpio]: class_create fail.\n");
- return -1;
- }
- <span style="white-space:pre"> </span>device_create(info.gpio_class, NULL, info.devid, NULL, DEVICE_NAME);
- <span style="white-space:pre"> </span>
- dprintk("[gpio]: success to create a gpio cdev.\n");
- //
- type = script_get_item("gpio_para", "gpio_used", &val);
- if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
- dprintk("[gpio]: type not right.\n");
- return -1;
- }
- if (!val.val) {
- dprintk("[gpio]: gpio is not used.\n");
- return -1;
- }
- dprintk("[gpio]: gpio is used.\n");
- //
- cnt = script_get_pio_list("gpio_para", &gpio_list);
- dprintk("[gpio]: cnt = %d.\n", cnt);
- info.gpio_cnt = cnt;
- if (cnt == 0) {
- dprintk("[gpio]: fail to script_get_pio_list.\n");
- return -1;
- }
- else {
- dprintk("[gpio]: requeset gpio(s).\n");
- for (i=0; i < cnt; i++) {
- dprintk("[gpio]: requeset gpio No.%d.\n", i+1);
- if (0 != gpio_request(gpio_list[i].gpio.gpio, NULL))
- dprintk("[gpio]: i = %d; fail to gpio_request.\n", i);
- }
- }
- //dprintk("[gpio]: 1.\n");
- //config gpio.
- if (0 != sw_gpio_setall_range(&gpio_list[0], cnt)) {
- dprintk("[gpio]: fail to sw_gpio_setall_range.\n");
- return -1;
- }
- //dprintk("[gpio]: 2.\n");
- /*************************************************************/
- gpio_fetch_config();
- //dprintk("[gpio]: 3.\n");
- #if 0
- //test gpio.
- gpio_direction_output(info.pin[4].gpio.gpio, 0);
- mdelay(5);
- gpio_direction_output(info.pin[4].gpio.gpio, 1);
- mdelay(5);
- #endif
- //dprintk("[gpio]: 4.\n");
- <span style="white-space:pre"> </span>return 0;
- }
- static void __exit gpio_module_exit(void)
- {
- dprintk("[gpio]: gpio_module_exit fn.\n");
- <span style="white-space:pre"> </span>
- device_destroy(info.gpio_class, info.devid);
- class_destroy(info.gpio_class);
- cdev_del(info.gpio_cdev);
- }
- module_init(gpio_module_init);
- module_exit(gpio_module_exit);
- MODULE_AUTHOR("chwenj@gmail.com");
- MODULE_DESCRIPTION("gpio driver");
- MODULE_LICENSE("GPL");
转:全志A20 GPIO 总结文档的更多相关文章
- A20 GPIO中断类型差别结果迥异的问题思考
A20GPIO中断类型差别结果迥异的问题思考 最近在使用全志A20做开发时,发现在处理中断的时候,用电平触发模式,报中断比较乱,用边沿触发则很稳定,不会乱报.笔者感到比较困惑,笔者用电平触发写的cod ...
- u-boot-2016.07 README文档结构
Author:AP0904225版权声明:本文为博主原创文章,转载请标明出处. 阅读u-boot的README文档,可以获取很多有用的信息,例如从哪里可以获得帮助,帮助:u-boot版本命名规则,目录 ...
- 【分享】iTOP4412开发板-Bluetooth移植文档
[分享]iTOP4412开发板-Bluetooth移植文档 最近须要把Bluetooth移植到iTOP-4412 开发平台.查阅了相关资料,经过一段时间的研究.调试,最终成功的将蓝牙功能移植到了开发板 ...
- iTOP-4412开发板-串口转接小板的使用文档
本文档介绍如何使用 迅为iTOP-4412 精英版如何使用串口转接板,串口小板如下所示.和串口转接板模块相关的资料如下:“iTOP-4412-Android-串口测试文档(升级版)_V2.X.zip” ...
- 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级
SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...
- 【swupdate文档 一】嵌入式系统的软件管理
嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...
- 开发者福利!百问I.MX6ULL裸机文档发布
终于等到你,百问科技近600页的100ask_imx6ull裸机文档发布,已经合并到“嵌入式Linux应用开发完全手册第2版_韦东山全系列视频文档全集.pdf(1222页)”,所有人免费下载学习. 本 ...
- STM32入门系列-库帮助文档使用
在前面文件夹介绍时,提到了stm32f10x_stdperiph_lib_um.chm文件,此文件是库函数使用帮助文档,可以直接打开如下图. 因为STM32库函数非常多,我们不可能把所有的外设函数都记 ...
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
随机推荐
- MVC三层架构编程(Dao、service、servlet 之间的关系)
木哈哈~先开心一会儿,人生的第一篇博客aaa.我一定好好写.不过之前也没怎么看别人写过,还是有点小激动呢,加油.好好总结,会总结的宝宝才会有提高! 今天想总结一下mvc三层架构模型编程,宝宝学习不怎么 ...
- 枚举的基本使用方法 Enumerations
枚举的基本使用方法 Enumerations Enumeration enum SomeEnumeration{ case enumeration1 case enumeration2 case ...
- Hadoop32位和64位的查询
1.查看自己的hadoop版本是32位还是64位 进入: hadoop-2.6.4/lib/native 使用file命令 file libhadoop.so.1.0.0
- MultiWii MWC的软件和调试方法
(如果你的电脑是win7 64位的系统,安装了JAVA虚拟机后GUI仍然运行不了,那你就需要到C:\Program Files\Java\jre7\bin\找到并复制javaw.exe,然后粘贴到C: ...
- mysql02
-- 查询课程名称 和年级的名称 -- 非等值连接查询 SELECT subjectname,gradeName FROM `subject`,grade -- 等值连接查询 SELECT subje ...
- react.js 你应知道的9件事
React.js 初学者应该知道的 9 件事 本文假定你已经有了一下基本的概念.如果你不熟悉 component.props 或者 state 这些名词,你最好先去阅读下官方起步和手册.下面的代码 ...
- Java 小型学生管理系统心得
这个学生管理系统相对来说比较简单,主要就是复习下java怎么连接数据库,然后你怎么来实现这个功能,我简单的说下思路吧. 首先你要构思好这个界面,他包括增删查改这些基本功能,然后你去分析这些功能都能怎么 ...
- nyoj 44
//nyoj 44 //和上面一题一样,求子串和,但是代码非常简洁..... 时间复杂度为n #include <iostream> using namespace std; int ma ...
- apache 2.4 You don't have permission to access / on this server
用的2.4版本,以前版本解决: 马上打开apache的配置文件httpd.conf,逐行检查.在大约快一半的地方有以下这段代码: <Directory /> Options Foll ...
- Linux命令行文本处理工具
关键字搜索: grep 关键字 指定文件 -i 搜索时忽略大小写 -n 显示结果所在行 -v 显示不包含关键字的行 基于列的文本处理: cut -d: -f1 /etc/passwd -d ...