一、配置GPIO读

在视频14的基础上做

1.利用拨码开关来实现GPIO输入

所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_GPC0(0)

XEINT6→GPX0_6→EXYNOS4_GPX0(6)

读寄存器手册分析流程:

设置寄存器为输入  GPC0CON

读寄存器值     GPC0DAT

不上拉,不下拉   GPC0PUD

2.GPIO的输入需要哪些函数,从arch\arm\plat-samsung\gpio-config.c中找

申请gpio_request

读寄存器gpio_get_value

设置GPIO为输入模式s3c_gpio_cfgpin  S3C_GPIO_INPUT

设置上拉下拉s3c_gpio_setpull S3C_GPIO_PULL_NONE

释放GPIO gpio_free

3.平台文件中设备注册

在文件arch/arm/mach-exynos/mach-itop4412.c中:

struct platform_device s3c_device_read_gpio_ctl = {

.name   = "read_gpio_ctl",

.id     = -1,

};

&s3c_device_read_gpio_ctl,

在init_lcd_type函数中request了GPIO。所以在get_lcd_type需要释放GPIO

gpio_free(EXYNOS4_GPC0(3));

gpio_free(EXYNOS4_GPX0(6));

4.Makefile修改

TARGET_NAME = read_gpio

APP_NAME = app_read_gpio

obj-m += $(TARGET_NAME).o

KDIR := /home/topeet/chen/kernel-3.0/iTop4412_Kernel_3.

PWD ?= $(shell pwd)

all:app

make -C $(KDIR) M=$(PWD) modules

app:$(APP_NAME)

arm-none-linux-gnueabi-gcc $(APP_NAME).c -o $(APP_NAME) -static

clean:

rm -rf *.o *.ko *.mod.c *.symvers *.order \

.$(TARGET_NAME)* $(APP_NAME)

Makefile

5.驱动的修改

#include

#include

/*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/

#include

/*注册杂项设备头文件*/

#include

/*注册设备节点的文件结构体*/

#include

/*Linux中申请GPIO的头文件*/

#include

/*三星平台的GPIO配置函数头文件*/

/*三星平台EXYNOS系列平台,GPIO配置参数宏定义头文件*/

#include

#include

/*三星平台4412平台,GPIO宏定义头文件*/

#include

#define DRIVER_NAME "read_gpio_ctl"

#define DEVICE_NAME "read_gpio_ctl"

MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("TOPEET");

static long read_gpio_ioctl( struct file *files, unsigned int cmd, unsigned long arg)

{

printk("cmd is %d,arg is %d\n",cmd,arg);

if(cmd > ){

printk(KERN_EMERG "cmd is 0 or 1\n");

}

if(arg > ){

printk(KERN_EMERG "arg is only 1\n");

}

//if cmd is 0, return GPC(3)>>switch3

//if cmd is 1, return GPX(6)>>switch4

if(cmd == ) {

return gpio_get_value(EXYNOS4_GPC0());

}

if(cmd == ) {

return gpio_get_value(EXYNOS4_GPX0());

}

return ;

}

static int read_gpio_release(struct inode *inode, struct file *file)

{

printk(KERN_EMERG "read_gpio release\n");

return ;

}

static int read_gpio_open(struct inode *inode, struct file *file)

{

printk(KERN_EMERG "read_gpio open\n");

return ;

}

static struct file_operations read_gpio_ops = {

.owner = THIS_MODULE,

.open = read_gpio_open,

.release = read_gpio_release,

.unlocked_ioctl = read_gpio_ioctl,

};

static struct miscdevice read_gpio_dev = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &read_gpio_ops,

};

static int read_gpio_probe(struct platform_device *pdv)

{

int ret;

printk(KERN_EMERG "\tinitialized\n");

ret = gpio_request(EXYNOS4_GPC0(),"Switch3");

if(ret < ){

printk(KERN_EMERG "gpio_request EXYNOS4_GPL2(0) failed!\n");

return ret;

} else {

s3c_gpio_cfgpin(EXYNOS4_GPC0(), S3C_GPIO_INPUT);

s3c_gpio_setpull(EXYNOS4_GPC0(), S3C_GPIO_PULL_NONE);

}

ret = gpio_request(EXYNOS4_GPX0(),"Switch4");

if(ret < ){

printk(KERN_EMERG "gpio_request EXYNOS4_GPL2(0) failed!\n");

return ret;

} else {

s3c_gpio_cfgpin(EXYNOS4_GPX0(), S3C_GPIO_INPUT);

s3c_gpio_setpull(EXYNOS4_GPX0(), S3C_GPIO_PULL_NONE);

}

misc_register(&read_gpio_dev);

return ;

}

static int read_gpio_remove(struct platform_device *pdv)

{

printk(KERN_EMERG "\tremove\n");

gpio_free(EXYNOS4_GPC0());

gpio_free(EXYNOS4_GPX0());

misc_deregister(&read_gpio_dev);

return ;

}

static void read_gpio_shutdown(struct platform_device *pdv)

{

;

}

static int read_gpio_suspend(struct platform_device *pdv,pm_message_t pmt)

{

return ;

}

static int read_gpio_resume(struct platform_device *pdv)

{

return ;

}

struct platform_driver read_gpio_driver = {

.probe = read_gpio_probe,

.remove = read_gpio_remove,

.shutdown = read_gpio_shutdown,

.suspend = read_gpio_suspend,

.resume = read_gpio_resume,

.driver = {

.name = DRIVER_NAME,

.owner = THIS_MODULE,

}

};

static int read_gpio_init(void)

{

int DriverState;

printk(KERN_EMERG "read_gpio enter!\n");

DriverState = platform_driver_register(&read_gpio_driver);

printk(KERN_EMERG "\tDriverState is %d\n",DriverState);

return ;

}

static void read_gpio_exit(void)

{

printk(KERN_EMERG "read_gpio exit!\n");

platform_driver_unregister(&read_gpio_driver);

}

module_init(read_gpio_init);

module_exit(read_gpio_exit);

read_gpio.c

应用程序:

#include

#include

#include

#include

#include

#include

#include

#define GPIOS 32

int main(int argc, char *argv[])

{

int fd, i, cmd = ;

char *read_gpio = "/dev/read_gpio_ctl";

char *cmd0 = "";

char *cmd1 = "";

printf("argv[0] is %s;argv[1] is %s;\n", argv[], argv[]);

if(strcmp(argv[], cmd0) == ) {

cmd = ;

}

if(strcmp(argv[], cmd1) == ) {

cmd = ;

}

if((fd = open(read_gpio, O_RDWR|O_NDELAY)) < ) {

printf("APP open %s failed\n", read_gpio);

} else {

printf("APP open %s success!\n", read_gpio);

printf("%d io value is %d\n", cmd, ioctl(fd, cmd, ));

}

close(fd);

}

app_read_gpio

测试结果:

[root@iTOP-]# ./app_read_gpio

argv[] is ./app_[ 312.514145] read_gpio open

[ 312.516876] cmd is ,arg is

[ 312.519870] read_gpio release

read_gpio;argv[] is ;

APP open /dev/read_gpio_ctl success!

io value is

[root@iTOP-]# ./app_read_gpio

argv[] is ./app_[ 314.786489] read_gpio open

[ 314.789131] cmd is ,arg is

[ 314.792307] read_gpio release

read_gpio;argv[] is ;

APP open /dev/read_gpio_ctl success!

io value is

[root@iTOP-]# ./app_read_gpio

argv[] is ./app_[ 321.786146] read_gpio open

[ 321.788790] cmd is ,arg is

[ 321.791899] read_gpio release

read_gpio;argv[] is ;

APP open /dev/read_gpio_ctl success!

io value is

[root@iTOP-]# ./app_read_gpio

argv[] is ./app_[ 323.449833] read_gpio open

[ 323.452526] cmd is ,arg is

[ 323.455489] read_gpio release

read_gpio;argv[] is ;

APP open /dev/read_gpio_ctl success!

io value is

测试结果

二、ioremap控制GPIO寄存器

上面使用的是直接通过软件转换好了的,其实内核也是可以自己做转化的。

自己实现物理地址到虚拟地址的转化,iounmap和ioremap函数可以实现物理地址到虚拟地址的转化

1.硬件

原理图部分

datasheet物理地址

GPL2CON = 0x1100 0000 + 0x0100 = 0x1100 0100

GPL2DAT = 0x1100 0000 + 0x0104 = 0x1100 0104

GPL2PUD = 0x1100 0000 + 0x0108 = 0x1100 0108

寄存器不一定是32位的,也有16位或8位的

2.软件

#include

#include

#include

MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("Topeet");

//用于存放虚拟地址和物理地址

volatile unsigned long virt_addr, phys_addr;

//用户存放三个寄存器的地址

volatile unsigned long *GPL2CON, *GPL2DAT, *GPL2PUD;

static void gpl2_device_init(void)

{

//物理地址起始地址0x1100 0100

phys_addr = 0x11000100;

//0x11000100是GPL2CON的物理地址

virt_addr = (unsigned long)ioremap(phys_addr, 0x10);

//指定需要操作的寄存器地址

GPL2CON = (unsigned long *)(virt_addr + 0x00);

GPL2DAT = (unsigned long *)(virt_addr + 0x04);

GPL2PUD = (unsigned long *)(virt_addr + 0x08);

}

//配置开发板的GPIO寄存器

static void gpl2_configure(void)

{

//配置为输出模式

*GPL2CON &= 0xFFFFFFF0;

*GPL2CON |= 0x00000001;

//GPL2PUD &= 0xfff0;

//GPL2PUD寄存器,bit[0:1]设为0x03,上拉模式

*GPL2PUD |= 0x0003;

}

//点灯

static void gpl2_on(void)

{

*GPL2DAT |= 0x01;

}

//灭灯

static void gpl2_off(void)

{

*GPL2DAT &= 0xfe;

}

static int led_gpl2_init(void)

{

printk(KERN_EMERG "led enter!\n");

gpl2_device_init(); //实现IO内存映射

gpl2_configure(); //配置GPL2为输出模式

gpl2_on();

printk("led dgp2 open\n");

return ;

}

static void led_gpl2_exit(void)

{

gpl2_off();

printk(KERN_EMERG "led exit!\n");

}

module_init(led_gpl2_init);

module_exit(led_gpl2_exit);

ioremap_leds.c

makefile文件:

TARGET_NAME = ioremap_leds

obj-m += $(TARGET_NAME).o

KDIR := /home/topeet/chen/kernel-3.0/iTop4412_Kernel_3.

PWD ?= $(shell pwd)

all:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -rf *.o *.ko *.mod.c *.symvers *.order \

.$(TARGET_NAME)*

Makefile

3.编译测试

[root@iTOP-]# insmod ioremap_leds.ko

[ 6116.064904] led enter!

[ 6116.065940] led dgp2 open

[root@iTOP-]# rmmod ioremap_leds

[ 6122.913415] led exit!

[root@iTOP-]# insmod ioremap_leds.ko

[ 6133.090595] led enter!

[ 6133.091567] led dgp2 open

[root@iTOP-]# rmmod ioremap_leds

[ 6137.830391] led exit

测试结果

加载驱动,小灯亮

卸载驱动,小灯灭

iTOP-4412嵌入式开发板ioremap控制GPIO寄存器

转自迅为电子技术论坛:http://bbs.topeetboard.com GPIO 的寄存器通过 ioremap函数转换之后,可以通过直接控制虚拟地址来控制物理地址(寄存器的实际地址),这样就实现 ...

EasyARM i&period;mx287学习笔记——通过modbus tcp控制GPIO

0 前言     本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机. 在该从机中定义了线圈寄存器.当中线圈寄存器地址较低的4位和EasyARM的P2 ...

rk3128 通过串口控制 GPIO

2019-04-24 关键字: rk平台控制GPIO功能.rk串口控制引脚电平 本篇文章介绍了如何通过串口来控制 RK3128.RK3288 平台的 GPIO . 我们可以很便捷地通过串口命令来控制 ...

Android&lpar;Java&rpar;控制GPIO的方法及耗时分析

前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍 ...

Android&lpar;Linux&rpar;控制GPIO方法二

前文主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

Android&lpar;Linux&rpar;控制GPIO的方法及实时性分析

Linux下控制GPIO的方法有N种,详细请参考,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中 ...

树莓派控制GPIO(Python)

如果你的raspi没有安装python那么先   sudo apt-get update sudo apt-get install python-dev   例如想要控制35管脚的亮灭: 先建一个文本 ...

树莓派&period;使用Node&period;js控制GPIO

树莓派上的40个GPIO是最好玩的东西 它们可以被C,/C++, Python, Java等语言直接控制 现在就来看看怎么用Node.js做到同样的事情 在试验之前, 请先安装好Node.js, 具体 ...

RaspberryPi2B使用bcm2835c库控制GPIO

RaspberryPi2B使用bcm2835c库控制GPIO 网上有很多RaspberryPi控制GPIO的方法,有Python.WiringPi.bcm2835 C library 使用bcm283 ...

随机推荐

Java hashCode&lpar;&rpar; 和 equals&lpar;&rpar;的若干问题

原文:http://www.cnblogs.com/skywang12345/p/3324958.html 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() ...

Release编译模式下,事件是否会引起内存泄漏问题初步研究

题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...

以app形式启动chrome——关于chrome命令行

转自:http://wiselyman.iteye.com/blog/2179043 转自:http://bbs.ithome.com/thread-589651-1-1.html 转自:http:/ ...

Qt之QLineEdit

简述 QLineEdit是一个单行文本输入框. QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做.剪切和粘贴.以及拖放(见setDragEnabled()). ...

linq 动态排序,不使用反射

之前网上搜索的相关方法都是使用了反射的方法来动态获取字段,以实现动态linq排序,但是因为项目组觉得此方法效率低下,所以不予采纳. 所以有了以下代码 public interface IBase{ d ...

队列的实现 -- 数据结构与算法的javascript描述 第五章

队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...

【转】使用sinopia五步快速完成本地npm搭建

使用sinopia五步快速完成本地npm搭建 时间 2016-03-01 14:55:30  繁星UED 原文  http://ued.fanxing.com/shi-yong-sinopiawu-b ...

OO第二单元作业小结

前言 转眼已是第九周,第二单元的电梯系列作业已经结束,终于体验了一番多线程电梯之旅. 第一次作业是单电梯的傻瓜调度,虽然是第一次写多线程,但在课程PPT的指引下,写起来还是非常容易:第二次作业是单电梯 ...

Java&plus;selenium之WebDriver的常用方法封装&lpar;八&rpar;

总结:WEB UI自动化测试一般采用 POP(面向页面编程),自动化测试框架分三层,有时如果页面如果太多,不好管理,可以面向控件编程,即把控件当作页面,毕竟控件是有限的,所以封装页面的代码量会少很多, ...

Web 中调用FreeSWITCH的Portal GUI配置记录

具体设定步骤: ①加载 mod_xml_rpc 模块:load mod_xml_rpc 若想让该模块在FreeSWITCH启动时而自动加载,在conf/autoload_configs/modules ...

arm64的ioremap_4412 GPIO读 和 ioremap控制GPIO寄存器相关推荐

  1. 4412 GPIO读 和 ioremap控制GPIO寄存器

    一.配置GPIO读 在视频14的基础上做 1.利用拨码开关来实现GPIO输入 所以AP_SLEEP对应GPC0_3,然后在drivers/gpio/gpio-exynos4.c中对应EXYNOS4_G ...

  2. sysfs方式控制GPIO

    sysfs方式控制GPIO 使用"gpiolib"实现框架的平台可选择配置一个GPIO的sysfs用户接口,这不同于debugfs接口,因为它提供GPIO方向和值的控制,而不仅是显 ...

  3. NanoPi-K2 控制GPIO

    NanoPi-K2控制GPIO 前言 定位GPIO位号 函数介绍 板子管脚定义 确定管脚位号 编写及编译 .KO 驱动文件 开发环境搭建 驱动编写 驱动加载 编写及编译APP文件 前言 网上关于Nan ...

  4. 4412开发板学习之Linux驱动开发(八):GPIO读操作与按键轮询实现

    GPIO读操作与按键轮询实现 GPIO读操作 硬件 查找对应IO口 寄存器配置 软件 需要的函数 注册设备 代码及分析 实验效果 按键轮询实现 原理分析 硬件 软件 用到的函数 先前准备工作 代码及分 ...

  5. python控制gpio的一段代码抄的

    控制gpio一个范例 1 import RPi.GPIO as GPIO 2 import time 3 4 channels = [16,18,22,24,26,19,21,23] 5 6 def ...

  6. linux应用开发:用户空间如何通过sysfs控制GPIO

    开发环境 Ubuntu:14.04 开发板:A33-Vstar 开发板系统:linux-3.4.39 ------------------------------------------------- ...

  7. matlab控制树莓派3b,树莓派3B+ 手机h5网页控制GPIO

    ezgif-4-5d181e9b42.gif 本文介绍如何在H5页面控制树莓派GPIO 仅实现以BCM编码方式控制GPIO,其他方式未做. 演示地址:http://gpio.exmll.cn/ 点击B ...

  8. python控制gpio产生固定数量的脉冲_STM32L151用dma控制GPIO口发出指定的脉冲个数的疑惑!...

    本帖最后由 mon51 于 2015-3-6 16:41 编辑 用DMA控制GPIO的一个IO脚,输出指定脉冲的个数项目,由于要低功耗!MCU主频不能高.采用的定时器联机,还是达不到输出150KHZ的 ...

  9. linux设备树sysfs,迅为-iMX6开发板-设备树内核-sys方式控制GPIO

    本文档主要讲解迅为-iMX6 开发板,通过 sys 文件的方式来控制 GPIO. 要通过 sys 控制 GPIO,需要做以下几步操作: 1 开启内核中的"GPIO_SYSFS"驱动 ...

最新文章

  1. SAP LT Replication Server与SAP HANA中与Replication相关的表
  2. 2015年9月百度前端在线笔试
  3. 你必须会的启发式搜索算法--A*算法
  4. C# datetime 操作
  5. nginx-exporter安装使用
  6. mysql 查询auto_increment_MySQL查询数据表的Auto_Increment(自增id)
  7. 利用Javascrip实现web窗体的打开和关闭后的刷新
  8. 数字人民币App正式上线 京东子钱包推送量峰值增长超过20倍
  9. 如何为自己赢得更好的口碑
  10. 统计分析软件_专业统计分析软件 SPSS 25 来了!手把手教你安装
  11. phpwind测试实战之phpwind安装(三)
  12. Ubuntu安装 Killer Wireless-AC 1550 Wireless 无线网卡驱动
  13. canvas学习(十):font字体设置
  14. linux安装ralink驱动程序,Linux 安装 FW150UM/RALINK 无线网卡
  15. 【持续更新】1998-2022历代英特尔显卡列表,英特尔显卡发布日期
  16. [Android] 小男孩短视频去水印新版来了,支持18多个短视频平台去水印例如抖音快手微视皮皮虾等...
  17. keras深度训练4:GPU设置
  18. android 特效字体下载,Android 一定有你想要的 文字特效 文字动画 艺术字
  19. 密码库LibTomCrypt学习记录——(2.3)分组密码算法的工作模式——ECB代码示例
  20. 不再封控,各高校要如何开展教学

热门文章

  1. 2005年:从市场经济的三大主体,简析中国共享软件的市场发展
  2. 学习数据可视化,我放弃了Excel和ECharts
  3. javase05(第六章)
  4. centos 下重置mysql密码
  5. 数组与类数组以及在类数组对象使用数组的方法
  6. 社区版Pycharm如何使用Flask
  7. 023,递归2 疯狂的兔子
  8. JS 双击事件绑定和取消事件绑定
  9. Linux的用户-组-权限详解
  10. 批量大文本筛选过滤工具开发记录