一、去掉占用GPIO的驱动

包括 leds,buzzer,camera ov5640,WIFI

/*led的两个IO,网络是KP_COL0,VDD50_EN*/
/*蜂鸣器的1个IO,网络是MOTOR_PWM*//*矩阵键盘的8个IO,网络是CHG_FLT,HOOK_DET,CHG_UOK,XEINT14_BAK,
GM_INT1,6260_GPIO1,CHG_COK,XEINT29/KP_ROW13/ALV_DBG25*//*摄像头的14个IO,网络是CAM_MCLK,CAM2M_RST,CAM2M_PWDN,
CAM_D5,CAM_D7,CAM_D6,CAM_D4,CAM_D3,CAM_D2,CAM_D1,
CAM_PCLK,CAM_D0,CAM_VSYNC,CAM_HREF。
I2C_SDA7,I2C_SCL7也是可以设置为GPIO,不过总线一般不要去动它*//*WIFI模块的7个IO,WIFI_D3,WIFI_CMD,WIFI_D1,WIFI_CLK,WIFI_D0,WIFI_D2,GPC1_1*/
/*串口RX和TX等也是可以设置为GPIO,一般不要动它*//*数组中有32个引出到端子或者模块的IO,还有类似sd卡等也是可以作为GPIO,
其它引到连接器但是没有使用的GPIO等等*/
/*SCP管脚编号和POP的稍微有点不同,下面是SCP的*/
static int led_gpios[] = {EXYNOS4_GPL2(0),EXYNOS4_GPK1(1),EXYNOS4_GPD0(0),EXYNOS4_GPX1(0),EXYNOS4_GPX1(3),EXYNOS4_GPX1(5),EXYNOS4_GPX1(6),EXYNOS4_GPX3(0),EXYNOS4_GPX2(6),EXYNOS4_GPX2(7),EXYNOS4_GPX3(5),EXYNOS4212_GPJ1(3),EXYNOS4_GPL0(1),EXYNOS4_GPL0(3),EXYNOS4212_GPJ1(0),EXYNOS4212_GPJ1(2),EXYNOS4212_GPJ1(1),EXYNOS4212_GPJ0(7),EXYNOS4212_GPJ0(6),EXYNOS4212_GPJ0(5),EXYNOS4212_GPJ0(4),EXYNOS4212_GPJ0(0),EXYNOS4212_GPJ0(3),EXYNOS4212_GPJ0(1),EXYNOS4212_GPJ0(2),EXYNOS4_GPK3(6),EXYNOS4_GPK3(1),EXYNOS4_GPK3(4),EXYNOS4_GPK3(0),EXYNOS4_GPK3(3),EXYNOS4_GPK3(5),EXYNOS4_GPC1(1),
};

1、去掉摄像头驱动VIDEO_OV5640

– Device Drivers
– Multimedia support(MEDIA_SUPPORT [=y])
– Video capture adapters(VIDEO_CAPTURE_DRIVERS [=y])(去掉)

2、去掉WIFI 驱动MTK_COMBO_CHIP_MT662

– Device Drivers– MediaTek Connectivity Combo Chip Config– MediaTek Connectivity Combo Chip Support (MTK_COMBO [=y])(去掉)– Select Chip (<choice> [=y])

# CONFIG_MTK_COMBO is not set

3、去掉leds 的驱动

--Device Drivers
--Character devices
--Enable LEDS config

4、去掉Buzzer 的驱动

--Device Drivers
--Character devices
--Enable BUZZER config

# CONFIG_LEDS_CTL is not set
CONFIG_HELLO_CTL=y
# CONFIG_BUZZER_CTL is not set

5、修改完之后重新编译内核,将新生成的内核二进制文件zImage 烧写到开发板。



二、多个GPIO设置测试源码

1、gpios.c

#include <linux/init.h>
#include <linux/module.h>
/*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/
#include <linux/platform_device.h>
/*注册杂项设备头文件*/
#include <linux/miscdevice.h>
/*注册设备节点的文件结构体*/
#include <linux/fs.h>
/*Linux中申请GPIO的头文件*/
#include <linux/gpio.h>
/*三星平台的GPIO配置函数头文件*/
/*三星平台EXYNOS系列平台,GPIO配置参数宏定义头文件*/
#include <plat/gpio-cfg.h>
#include <mach/gpio.h>
/*三星平台4412平台,GPIO宏定义头文件*/
#include <mach/gpio-exynos4.h>#define DRIVER_NAME "skyfall"
#define DEVICE_NAME "skyfall_gpios"MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("SKYFALL");/*led的两个IO,网络是KP_COL0,VDD50_EN*/
/*蜂鸣器的1个IO,网络是MOTOR_PWM*/
/*矩阵键盘的8个IO,网络是CHG_FLT,HOOK_DET,CHG_UOK,XEINT14_BAK,
GM_INT1,6260_GPIO1,CHG_COK,XEINT29/KP_ROW13/ALV_DBG25*/
/*摄像头的14个IO,网络是CAM_MCLK,CAM2M_RST,CAM2M_PWDN,
CAM_D5,CAM_D7,CAM_D6,CAM_D4,CAM_D3,CAM_D2,CAM_D1,
CAM_PCLK,CAM_D0,CAM_VSYNC,CAM_HREF。
I2C_SDA7,I2C_SCL7也是可以设置为GPIO,不过总线一般不要去动它*/
/*WIFI模块的7个IO,WIFI_D3,WIFI_CMD,WIFI_D1,WIFI_CLK,WIFI_D0,WIFI_D2,GPC1_1*/
/*串口RX和TX等也是可以设置为GPIO,一般不要动它*/
/*数组中有32个引出到端子或者模块的IO,还有类似sd卡等也是可以作为GPIO,
其它引到连接器但是没有使用的GPIO等等*/static int led_gpios[] = {EXYNOS4_GPL2(0),EXYNOS4_GPK1(1),EXYNOS4_GPD0(0),EXYNOS4_GPX1(0),EXYNOS4_GPX1(3),EXYNOS4_GPX1(5),EXYNOS4_GPX1(6),EXYNOS4_GPX3(0),EXYNOS4_GPX2(6),EXYNOS4_GPX2(7),EXYNOS4_GPX3(5),EXYNOS4212_GPJ1(3),EXYNOS4_GPL0(1),EXYNOS4_GPL0(3),EXYNOS4212_GPJ1(0),EXYNOS4212_GPJ1(2),EXYNOS4212_GPJ1(1),EXYNOS4212_GPJ0(7),EXYNOS4212_GPJ0(6),EXYNOS4212_GPJ0(5),EXYNOS4212_GPJ0(4),EXYNOS4212_GPJ0(0),EXYNOS4212_GPJ0(3),EXYNOS4212_GPJ0(1),EXYNOS4212_GPJ0(2),EXYNOS4_GPK3(6),EXYNOS4_GPK3(1),EXYNOS4_GPK3(4),EXYNOS4_GPK3(0),EXYNOS4_GPK3(3),EXYNOS4_GPK3(5),EXYNOS4_GPC1(1),
};//#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define LED_NUM     ARRAY_SIZE(led_gpios)static long skyfall_ioctl( struct file *files, unsigned int cmd, unsigned long arg){printk("cmd is %d,arg is %d\n",cmd,arg);//arg为GPIO的数量,一共为32个,需要小于32个.//cmd为设置GPI的状态,1为将对应的GPIO设置为高电平,0为将对应的GPIO设置为低电平.switch(cmd){case 0:case 1:if (arg > LED_NUM) {return -EINVAL;}gpio_set_value(led_gpios[arg], cmd);break;default:return -EINVAL;}gpio_set_value(led_gpios[2], 0);return 0;}static int skyfall_release(struct inode *inode, struct file *file){printk("%s,%d\n",__func__,__LINE__);printk(KERN_EMERG "skyfall release!\n");return 0;
}static int skyfall_open(struct inode *inode, struct file *file){printk("%s,%d\n",__func__,__LINE__);printk(KERN_EMERG "skyfall open!\n");return 0;
}static struct file_operations skyfall_ops = {.owner           = THIS_MODULE,.open            = skyfall_open,.release         = skyfall_release,.unlocked_ioctl  = skyfall_ioctl,
};static  struct miscdevice skyfall_dev = {.minor       = MISC_DYNAMIC_MINOR,.name        = DEVICE_NAME,.fops        = &skyfall_ops,
};static int skyfall_probe(struct platform_device *pdv){int ret,i;printk(KERN_EMERG "initialized\n");for(i=0; i < LED_NUM; i++){ret = gpio_request(led_gpios[i], "LED");if (ret) {printk("%s: request GPIO %d for LED failed, ret = %d\n", DRIVER_NAME,i, ret);}else{s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);gpio_set_value(led_gpios[i], 1);            }}//单独将蜂鸣器的关掉,为的是不让它开始鸣叫,要不太吵!gpio_set_value(led_gpios[2], 0);printk("%s,%d\n",__func__,__LINE__);ret = misc_register(&skyfall_dev);if(ret < 0){printk("leds:register device failed!\n");}
return 0;}static int skyfall_remove(struct platform_device *pdv){int i;printk(KERN_EMERG "remove!\n");for(i=0; i < LED_NUM; i++){gpio_free(led_gpios[i]);}misc_deregister(&skyfall_dev);return 0;}static void skyfall_shutdown(struct platform_device *pdv){return ;
}static int skyfall_suspend(struct platform_device *pdv,pm_message_t pmt){return 0;
}static int skyfall_resume(struct platform_device *pdv){return 0;
}struct platform_driver skyfall_driver = {.probe          = skyfall_probe,.remove         = skyfall_remove,.shutdown       = skyfall_shutdown,.suspend        = skyfall_suspend,.resume         = skyfall_resume,.driver         = {.name  = DRIVER_NAME,.owner = THIS_MODULE,}
};static int __init skyfall_init(void)
{int DriverState;printk("%s,%d\n",__func__,__LINE__);printk(KERN_EMERG "skyfall driver enter!\n");printk("LED_NUM = %d\n",LED_NUM);DriverState = platform_driver_register(&skyfall_driver);printk(KERN_EMERG "DriverState = %d\n",DriverState);return 0;
}static void skyfall_exit(void)
{printk("%s,%d\n",__func__,__LINE__);printk(KERN_EMERG "skyfall driver exit!\n");platform_driver_unregister(&skyfall_driver);return ;
}module_init(skyfall_init);
module_exit(skyfall_exit);

2、Makefile文件

#!/bin/bash
$(warning KERNELRELEASE = $(KERNELRELEASE))ifeq ($(KERNELRELEASE),)#内核的源码路径, ?= 条件赋值, uname -r 得到内核版本号
KERNELDIR ?=  /home/mint/itop/linux_3.0
# := 立即赋值, 得到当前的绝对路径
PWD := $(shell pwd)# -C 切换工作路径, $(MAKE) =  make
modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*.PHONY: modules cleanelse# 生成模块obj-m := gpios.o endif

3、编译生成的驱动文件

4、将该驱动加载至开发板测试


在 /dev下生成了skyfall_gpios设备节点。



三、应用层测试GPIO

1、test_gpios.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>#define GPIOS 32int main(int argc , const char *argv[])
{int fd,i,cmd=2;char *leds = "/dev/skyfall_gpios";char *cmd0 = "0"; char *cmd1 = "1";if(argc < 2){printf("Usage %s <0 or 1>!\n",argv[0]);return -1;}printf("argv[0] is %s ===> argv[1] is %s!\n",argv[0],argv[1]);if(strcmp(argv[1], cmd0) == 0){cmd = 0;printf("cmd is 0!\n");}if(strcmp(argv[1], cmd1) == 0){cmd = 1;printf("cmd is 1!\n");}if((fd = open(leds,O_RDWR|O_NDELAY)) < 0){printf("APP open %s is failed!\n",leds);}else{printf("APP open %s is success!\n",leds);for(i = 0; i < GPIOS; i++){ioctl(fd,cmd,i);printf("APP ioctl %s ,cmd is %d,i is %d!\n",leds,cmd,i);}}close(fd);return 0;
}

2、生成的ELF文件

3、测试

(1)将以上两个文件放到开发板中,加载驱动
insmod gpios.ko

(2)运行ELF文件

./test_gpios

(3)测试结果

(4)卸载驱动

                 rmmod gpios

检查一下运行应用之后有没有错误,如果有错误,多半是因为没有将调用对应GPIO的驱动去除,导致GPIO 被占用了。



013_itop4412设置多个GPIO相关推荐

  1. STM32F103 PB3 PB4 设置成普通GPIO的配置

    一个ESP8266的小项目 https://blog.csdn.net/shitou123xsx/article/details/90550098 最近由于任务需要,用STM32F103C8T6做了一 ...

  2. 关于STM32 PB3 PB4 如何设置成普通GPIO的配置

    转载地址  https://blog.csdn.net/love33521/article/details/8308036 对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进 ...

  3. GD32 关于PB3,PB4,PA15 的GPIO工作不正常的问题-设置为普通gpio

    PB3,PB4 的默认引脚功能是JTAG 或SWD功能 我们应该修改io的功能映射,涉及函数有 /*!\brief configure GPIO pin remap\param[in] gpio_re ...

  4. MTK:GPIO模式与设置

    GPIO设置篇  一.GPIO有关的函数  1.GPIO_ModeSetup: 函数原型:voidGPIO_ModeSetup(kal_uint16pin,kal_uint16conf_dada)  ...

  5. GPIO端口初始化设置,STM32F103点亮LED流水灯过程

    文章目录 一.STM32F103系列芯片地址映射和寄存器映射原理 1.什么是寄存器 2.地址映射和寄存器映射 3.寄存器地址查找 二.GPIO端口初始化设置 1.GPIO简介 2.配置时钟 3.输入输 ...

  6. 应广单片机 PMS150G、FPC161 基础例子【GPIO设置】

    应广单片机 PMS150G.FPC161 基础例子[GPIO设置] 调试方式:仿真器5S-I-S02B 编译软件:FPPA IDE 编译语言:mini C 电脑系统:win10 软件功能:设置GPIO ...

  7. STM32F103的映射的介绍、GPIO端口初始化设置和点流水灯详细操作

    文章目录 一.STM32F103的映射介绍 1.地址映射介绍 2.寄存器映射的介绍 二.GPIO端口的初始化设置 1.GIPO简介 2.时钟配置 3.输入输出模式设置 4.最大速率设置 三.实例--流 ...

  8. MTK平台使用代码对GPIO管脚进行设置

    平台:MTK6795 Android5.0 目的:在MTK6795平台使用代码对MT6795的GPIO166 GPIO167 GPIO168 GPIO169管脚设置成普通的GPIO功能,输出 在And ...

  9. zynq学习03 zynq中三种实现GPIO的方式

    http://m.blog.csdn.net/article/details?id=52123465 http://blog.chinaaet.com/songhuangong/p/43084 本文介 ...

  10. pinctrl 和 gpio 子系统

    内容来自<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf> 目录 pinctrl 子系统 pinctrl 子系统简介 I.MX6ULL 的 pinctrl 子系统 ...

最新文章

  1. Cannot format given Object as a Date
  2. MySQL外键约束On Delete、On Update各取值的含义
  3. 稀疏矩阵的三元组表与十字链表存储
  4. PHP的函数file_get_contents() 把整个文件读入一个字符串中
  5. python android自动化基于java_Appium+Python自动化 1 环境搭建(适用windows系统-Android移动端自动化)...
  6. JAVA的IO编程:管道流
  7. python多版本共存 ubuntu_Linux下python3与python3的多版本共存
  8. 在vSphere 6.x vSAN数据存储上使用Oracle RAC(2121181)
  9. IntelliJ IDEA 插件推荐
  10. 开源API网关系统:Kong简介
  11. 使用android busybox拷贝文件到qnx系统
  12. ks检验与s-w 检验_数据分析基础(2)——正态分布检验
  13. 自己用GO语言编写的AliDDNS动态域名更新服务,routeros
  14. 沪深300股指破冰金融期权衍生品市场“基建”再进一步
  15. 了解torch.nn.DataParallel
  16. 五个了解自己天赋优势的分析工具(二)盖洛普优势测评
  17. Android基于Facebook Rebound的动画效果框架Backboard demo (非常炫酷)
  18. Centos Linux 和 CentOS Stream比较
  19. C语言中的switch详解
  20. 巴西支付Boleto对巴西外贸有多重要!?

热门文章

  1. 4D-Net for Learned Multi-Modal Alignment 论文笔记
  2. 基金投资理财专栏介绍
  3. 一个高考落榜生的奋斗历程
  4. 【 Laravel 工具包推荐--角色/权限管理】
  5. 数学期望一-指数分布的数学期望
  6. 如果忘记了学信网手机号可以试着这样找回
  7. 计算机网络四级考试及格分数,四级多少分才算过了 多少分及格
  8. 2019 JAVA面试题附答案
  9. 台式计算机键盘灯打开方式,台式电脑开机时键盘灯不亮,必须要按一下Numlock才会亮,但系统没什么问题。怎么办?...
  10. MATLAB APP设计工具