关键词:
在一个嵌入式系统中使用最多的莫过于 通用输入输出 GPIO口。看到论坛中经常有朋友问海思为什么没有提供GPIO驱动。其实不然。
在海思SDK xxx/osdrv/tools/board_tools/reg-tools-1.0.0/source/tools/下 提供了himm的读写工具源码。
你也可以根据himm的源码来写一个文件设备操作的驱动。毕竟轮子已经有了,我们就没必要再去造轮子了。
这个工具是用来 配置海思寄存器的。当然可以稍加改造或者在应用直接使用来控制通用寄存器。
根据海思提供资料 ,配置一个通用GPIO需要做如下工作。
1. 参考“管脚复用控制寄存器”配置管脚的相应位,使能需要使用的 GPIO管脚功能。(这块大家自己去查复用寄存器表)
2. 配置寄存器 GPIO_DIR,选择 GPIO是作为输入还是输出。
GPIO用于输入:外部信号通过 GPIO 管脚送进来,此时可通过 GPIO_DATA 寄存器查看输入信号值。
注意:输入的信号会同时送到和 GPIO复用的管脚上。
GPIO用于输出:先向 GPIO_DATA 寄存器写入相应值后,再通过 GPIO输出写入值。
GPIO8 0x201D_0000
GPIO7 0x201C_0000
GPIO6 0x201B_0000
GPIO5 0x201A_0000
GPIO4 0x2019_0000
GPIO3 0x2018_0000
GPIO2 0x2017_0000
GPIO1 0x2016_0000
GPIO0 0x2015_0000
GPIOn对应的寄存器地址为:GPIOn基地址+该寄存器偏移地址。
下面是比较关键的一个问题:我们知道对GPIO_DATA的操作可以控制输出,如果DIR方向是输入,可以读取这个地址的值 。那么怎么进行位操作呢?
海思的手册给出如下解释。海思的DATA寄存器通过 一个10位的地址中的高8位进行位寻址。
比如我要操作
若地址为 0x3FC(0b11_1111_1100) ,则对 GPIO_DATA[7:0]这 8bit操作全部有效。
操作方式: 基地址+偏移地址 0x3FC就为便宜地址,如果对该地址的寄存器操作则对所有8个IO的控制有效。
若地址为 0x200(0b10_0000_0000) ,则仅对 GPIO_DATA[7]的操作有效。
另一个关键寄存器
GPIO_DIR 方向寄存器 偏移地至 0x400
下面举个栗子: (控制开发板3G电源)
比如控制GPIO0_1
基地址 GPIO0_BASE 0x2015_0000
GPIO_DIR = GPIO0_BASE + OFFSET(0x400) 0:输入 1:输出
则数据DATA寄存器地址 0b00_0000_1000 = 0x08
对了别忘了复用:
复用的基地址 0x200F0000 复用偏移地址 0x09c
该寄存器 bit0 控制复用 0 为GPIO 1为功能。
himm 0x200F009C 0
himm 0x20150400 2
himm 0x20150008 0xFF
附图:
3G_RST = RMII_TXD0 功能1 : GPIO0-2
3G_Power = RMII_TXEN 功能1: GPIO0-1
复用寄存器基地址 0x200F 0000
偏移地址
这是HI3531的/etc/init.d/rcS的内容,结合HIMM工具,我们分析一下。
#GPIO17 3~6
himm 0x200F0234 0
himm 0x200F0238 0
himm 0x200F023C 0
himm 0x200F0240 0
#GPIO17 DIR
himm 0x20260400 0x20
#GPIO17_5 BUZZER
himm 0x20260080 0x20
ifconfig eth0 192.168.0.140
ifconfig eth1 192.168.1.163
telnetd&
#GPIO17_5 BUZZER
himm 0x20260080 0x0
#GPIO17 3~6
himm 0x200F0234 0
himm 0x200F0238 0
himm 0x200F023C 0
himm 0x200F0240 0
这四行是定义GPIO17的3~6引脚为GPIO1的功能,即用作IO管理用。
地址计算为基地址0X200F0000, 再加上0X234, 定义GP17.3的地址。
#GPIO17 DIR
himm 0x20260400 0x20
这是定义GPIO17.5脚为输出引脚,即方向引脚。记住:0X400都是方向引脚,一个组只有一个寄存器
#GPIO17_5 BUZZER
himm 0x20260080 0x20
这里直接输出17_5的引脚为高电平,引脚为高,蜂鸣器开始响了。 0X20为0B0010_0000, 也就是BIT5, 管脚号是GPIO17_0~GPIO17_7,
这里的0x20260080 的数据寄存器
再加上偏移地址0X080, 计算方法为: 0X20260000 + (1 《 (5 + 2))
其中5为管脚号, 2为右移MASK地址PADDR[9:2]
#GPIO17_5 BUZZER
himm 0x20260080 0x0
在运行了网络配置和TELNET程序后,置GPIO17_5脚为低电平,关掉蜂鸣器。
http://blog.csdn.net/USB_ABC/article/details/51714458
http://blog.csdn.net/xyyangkun/article/details/8485426?reload 驱动
嵌入式开发之hi3519---spinorflash启动
author:pkfqq:13277066461.官方hi3519默认是硬件3byte地址模式,配置完ddr始终后,sdkv100.020是可以支持正常启动,用到低位16Mflash内存2.如果要换成emmc启动,由于emcc的环境变量和分区信息,要在start.s中跳过960个字节3.无论nand ornorfla... 查看详情
嵌入式开发之hisilicon---hi3536处理器简介
(1)处理器概述(2)处理器模块架构 --------------author:pkf-------------------time:7-19---------------------------qq:1327706646 (1) ProcessorCore z ARMCortexA17[email protect 查看详情
嵌入式开发之hi3516---gv7601spi通信问题
http://blog.csdn.net/qq_29350001/article/details/52669964http://blog.csdn.net/zqj6893/article/details/50386921http://blog.csdn.net/yangzhongxuan/article/details/8021743http://www.ebaina.com/bbs/thread 查看详情
嵌入式开发之hi3519---pciedma和dmacache缓存更新syncmemery
http://blog.csdn.net/likeping/article/details/42235111linux下dma管理http://blog.csdn.net/skyflying2012/article/details/48023447cache和内存一致性.http://www.360doc.com/content/16/0510/07/478627_557742072.shtmlh 查看详情
嵌入式开发之hi3519---进程线程间的同步和互斥,条件变量信号了互斥锁等
sem_post最安全sem 有序,会卡顿阻塞 mutex 无序,不能同步http://blog.chinaunix.net/uid-20671208-id-4935154.htmlhttps://www.cnblogs.com/ngnetboy/p/3521547.htmlhttp://www.jianshu.com/p/1e59f0970bf5 http 查看详情
嵌入式开发之zynq---zynqps侧sd驱动
http://blog.chinaunix.net/uid-29404121-id-4217026.htmlhttp://blog.chinaunix.net/uid-29709984-id-4304978.htmlhttp://blog.chinaunix.net/uid-26707720-id-3979376.htmlhttp://blog.chinaunix.net/uid-21973366 查看详情
嵌入式开发之zynq---zynqps侧i2c驱动架构
http://blog.chinaunix.net/uid-24148050-id-120532.htmlhttp://bbs.csdn.net/topics/390538368?page=1http://blog.csdn.net/lanyou1900/article/details/41724103http://blog.csdn.net/lqxandroid2012/article/deta 查看详情
改变嵌软开发思维方式之:状态机+事件驱动框架
关注「嵌入式大杂烩」,选择「星标公众号」一起进步!作者 | Alicedodo状态机是一种思想,事件驱动也是一种思想。状态机推文:干货|嵌入式之状态机编程改变嵌软开发思维方式之:状态机的三种实现方法... 查看详情
linux——linux驱动之杂项设备(基本概念注册流程杂项设备的驱动编写)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《嵌入式Linux开发实战 查看详情
linux——linux驱动之杂项设备(基本概念注册流程杂项设备的驱动编写)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《嵌入式Linux开发实战 查看详情
cortex-m3之stm32嵌入式系统设计的内容简介
...2深入开发以及stm32高级开发三部分。基础开发部分介绍了嵌入式系统概述、stm32最小系统设计、stm32程序设计入门、gpio应用、gcc编译器的安装与应用、stm32外部中断、面向对象设计的本质、usart通信等内容;深入开发部分介绍了深... 查看详情
正点原子i.mx6u-mini驱动篇2嵌入式linux驱动开发之点灯大法(代码片段)
一、先看原理图首先查看原理图,看看我们的板子上的LED等接在哪一个IO口上面。好了,看原理图我们知道LED灯接在芯片的GPIO1的第三个引脚上面,也就是GPIO1_IO03。二、IMX6UL的GPIO操作方法先掌握三个名词CCM:ClockControlle... 查看详情
linux——linux驱动之imx6ull平台下多点触摸屏驱动开发实战(mt协议多点触摸api基于框架的触摸驱动编写触摸芯片驱动)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情
linux——linux驱动之imx6ull平台下多点触摸屏驱动开发实战(mt协议多点触摸api基于框架的触摸驱动编写触摸芯片驱动)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情
linux——linux驱动之应用层与内核层的数据交互(设备节点操作实践)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《嵌入式Linux开发实战 查看详情
linux——linux驱动之应用层与内核层的数据交互(设备节点操作实践)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《嵌入式Linux开发实战 查看详情
linux——linux驱动之玩转spi(上)linux下spi驱动框架简析及spi设备驱动代码框架实现步骤
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情
linux——linux驱动之玩转spi(上)linux下spi驱动框架简析及spi设备驱动代码框架实现步骤
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情