使script.bin文件配置生效的驱动
1.问题:在全志方案中如果需要设置上拉或者下拉模式,需要在script.bin(先转换为script.fex)中配置gpio口 如:

但是配置好后是不会生效的,需要写一个驱动来通过读取这个文件的gpio配置来配置相应的寄存器。
代码:
#include <linux/init.h>
#include <linux/module.h>
#include <mach/sys_config.h>
#include <mach/pinctrl.h>
#include <asm/io.h>
#include <mach/gpio.h> #define PIO_BASE 0x01c20800
typedef volatile unsigned int uint32;
typedef struct {
// gpio口的功能配置寄存器, 每个io口在配置寄存器里占用4位(实际用3位)
uint32 CFGs[]; //4个功能配置寄存器,每个寄存配置8个io口 // gpio口的数据寄存器, 每个io口占用一位.
uint32 DAT; // gpio口驱动电流配置寄存器, 每个io口占用2位
uint32 DRVs[]; // 两个寄存器,每个寄存器配置16个io口 // gpio口上下拉配置寄存器, 每个io口占用2位
uint32 PULLs[]; // 两个寄存器,每个寄存器配置16个io口 }PIO_t; //表示每组io口都有的配置寄存器 static PIO_t *pios[]; // 每个元素分别存放PA, PB, PC, PD, PE, PF, PG组io口的寄存器地址
static u8 *vaddr; static int __init h3gpio_init(void)
{
script_item_u *list;
int n, i, j, k;
int sel, pull, drv, level; vaddr = ioremap(PIO_BASE, SZ_4K); //映射gpio配置寄存器的基地址
if (NULL == vaddr)
return -ENOMEM; for (i = ; i < ARRAY_SIZE(pios); i++) //准备好每组io口的配置寄存器的地址
pios[i] = (PIO_t *)(vaddr+i*0x24); // pa的配置寄存器0的地址 == &pios[0]->CFG0
n = script_get_pio_list("gpio_para", &list); //返回值为gpio口的个数
if (n <= )
return -ENODEV; for (i = ; i < n; i++)
{
//在内核里每组io口都算是32个一组,即使硬件上每组都没有32个io口那么多.
//所以list[i].gpio.gpio / 32 即可算出是第几组,
j = list[i].gpio.gpio >> ; // pios[j]就是表示相应组的配置寄存结构体
k = list[i].gpio.gpio & ; //算出在组内是第几个io口 sel = list[i].gpio.mul_sel; //script.bin里io功能选择
pull = list[i].gpio.pull; //上下拉功能
drv = list[i].gpio.drv_level; //驱动电流等级
level = list[i].gpio.data; //io口作输出时,输出什么电平 if (- != sel) //功能选择不是<default>
{
pios[j]->CFGs[k>>] &= ~(0xf << ((k&)<<));
pios[j]->CFGs[k>>] |= sel << ((k&)<<); if ( == sel) //如果是输出,还需指定输出的电平
{
pios[j]->DAT &= ~(<<k);
pios[j]->DAT |= level << k;
}
}
if (- != pull) //上下拉功能不是<default>
{
pios[j]->PULLs[k>>] &= ~( << ((k&)<<)); pios[j]->PULLs[k>>] |= pull << ((k&)<<);
} if (- != drv) //驱动电流等级不是<default>
{
pios[j]->DRVs[k>>] &= ~( << ((k&)<<));
pios[j]->DRVs[k>>] |= drv << ((k&)<<);
}
} return ;
} static void __exit h3gpio_exit(void)
{
iounmap(vaddr);
} module_init(h3gpio_init);
module_exit(h3gpio_exit); MODULE_LICENSE("GPL");
2.Makefile 文件
KDIR := /home/edan/uboot_kernel/orangepi_sdk/source/linux-3.4.
obj-m += gpio.o export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf- all:
make -C $(KDIR) modules M=`pwd` .PHONY :clean
clean: make -C $(KDIR) modules clean M=`pwd`
使script.bin文件配置生效的驱动的更多相关文章
- Apache 中httpd.conf文件配置详解(转载)
httpd.conf文件配置详解 Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现.下面让我们来看看htt ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
- 咱就入个门之NHibernate映射文件配置(一)
之前写了数据库连接配置,这次说说映射文件的配置,即表映射[ORM的核心就是此啦!]. 下面我们使用最原始的手动配置hbm.xml文件. 步骤: 1.添加People类 namespace NHiber ...
- 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good
上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...
- 如何修改script.bin/script.fex
你是否经常看见其他帖子里或者其他人提到要修改script.bin或script.fex ,但你又不知道怎么改. 其实 script.bin就是script.fex通过 fex2bin生成的,scrip ...
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
JavaScript日历控件开发 概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...
- 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册
第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...
- postgresql 修改配置生效方法
对于配置服务器,,太多时候我们在Linux中做的操作是,配置*.conf文件,然后重启服务.而很多服务都具有reload功能,而但是具体到某个配置,有时候直接说出需不需要重启服务而使得配置生效,这并不 ...
- PostgreSQL.conf文件配置详解[转]
一.连接配置与安全认证 1.连接Connection Settings listen_addresses (string) 这个参数只有在启动数据库时,才能被设置.它指定数据库用来监听客户端连接的 ...
随机推荐
- 统计Shell脚本执行时间
统计Shell脚本执行时间,帮助分析改进脚本执行 用 date 相减 #!/bin/bash startTime=`date +%Y%m%d-%H:%M:%S` startTime_s=`date + ...
- 高性能集群软件keepalived
Keepalived介绍 以下是keepalive官网上的介绍.官方站点为http://www.keepalived.org. Keepalived is a routing sof ...
- Neo4j图形数据库备份
Neo4j图形数据库备份 backup.sh文件 nowtime=`date +"%Y-%m-%d_%H_%M"` #原文件路径 sourcepath='/home/neo4j/n ...
- C/C++源程序到可执行程序的过程
源程序.cpp 预处理得到 预处理文件.i 编译得到 汇编文件.S 汇编得到 目标文件.o 链接得到 可执行文件 例子:main.cpp fun.cpp fun.h #inclu ...
- java笔记——手写+键入
Frame.setDefaultCloseOpreation() Default:默认的 设置默认关闭操作 (0:什么都不干: 1:隐藏窗口: 2:关闭窗口但继续运行程序: 3:关闭窗口关闭程序:) ...
- vue项目 首页开发 part3
da当拖动图标时候,只有上部分可以,下部分无响应 swiper 为根页面引用,其中的css为独立,点击swiper标签可以看见其包裹区域只有部分 那么需要修改 就需要穿透样式 外部 >> ...
- JavaScript学习总结(五)
之前的几讲中我们曾经说过,JavaScript中是没有类的概念的.但是我们讲过对象,那么这个对象是怎么来的呢? 只要有函数即可创建对象 自定义对象 自定义对象的方式: 1. 使用无参的函数创建对象 & ...
- AES学习小结
AES是基于数据块的加密方式,即每次处理的数据是一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度. AES支持五种模式:CBC,C ...
- MySQL的InnoDB的幻读问题
MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ). 未提交读(READ UNCOMMITTED).另一个事务修改了数据,但尚未提交,而本事务中的SEL ...
- ubuntu14.10安装gitlab
1 换源: # curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/ ...