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文件配置生效的驱动的更多相关文章

  1. Apache 中httpd.conf文件配置详解(转载)

    httpd.conf文件配置详解   Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现.下面让我们来看看htt ...

  2. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  3. 咱就入个门之NHibernate映射文件配置(一)

    之前写了数据库连接配置,这次说说映射文件的配置,即表映射[ORM的核心就是此啦!]. 下面我们使用最原始的手动配置hbm.xml文件. 步骤: 1.添加People类 namespace NHiber ...

  4. 深入浅出Mybatis系列(八)---mapper映射文件配置之select、resultMap good

    上篇<深入浅出Mybatis系列(七)---mapper映射文件配置之insert.update.delete>介绍了insert.update.delete的用法,本篇将介绍select ...

  5. 如何修改script.bin/script.fex

    你是否经常看见其他帖子里或者其他人提到要修改script.bin或script.fex ,但你又不知道怎么改. 其实 script.bin就是script.fex通过 fex2bin生成的,scrip ...

  6. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  7. 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册

    第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...

  8. postgresql 修改配置生效方法

    对于配置服务器,,太多时候我们在Linux中做的操作是,配置*.conf文件,然后重启服务.而很多服务都具有reload功能,而但是具体到某个配置,有时候直接说出需不需要重启服务而使得配置生效,这并不 ...

  9. PostgreSQL.conf文件配置详解[转]

    一.连接配置与安全认证 1.连接Connection Settings   listen_addresses (string) 这个参数只有在启动数据库时,才能被设置.它指定数据库用来监听客户端连接的 ...

随机推荐

  1. Maven - Repository(存储库)

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  2. DQL多表查询

    DQL多表查询 一.多表查询实现多个表之间查询数据 1.交叉连接笛卡尔积:A表中的每一行匹配B表中的每一行基本结构:select [数据库名1.]表名1,属性名1,......, [数据库名.]表名. ...

  3. c 循环左移

    char b[11] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}; const int iShift = 4; for (int j = ...

  4. 线程与进程 concurrent.futures模块

    https://docs.python.org/3/library/concurrent.futures.html 17.4.1 Executor Objects class concurrent.f ...

  5. 题目(或游戏)流程控制器上传到GitHub

    题目控制系统 1 支持 题目按相同的个数分组 2 支持 pause resume 3 支持 每题限定时间 4 支持 支持对计时器进行回调 5 支持 在全流程开始,全流程结束,每组开始,每组结束,每题开 ...

  6. linux 安装禅道 和 CentOS 7 开放防火墙端口 命令

    linux 安装禅道链接:  https://www.cnblogs.com/maohuidong/p/9750202.html CentOS 7 开放防火墙端口 命令 链接:https://www. ...

  7. Python 时间 time

    import time print time.strftime("%Y-%m-%d") import datetime print datetime.datetime.now() ...

  8. 云平台发展前沿报告 微软云平台——Windows Azure

    微软云平台——Windows Azure Windows Azure 是微软研发的公有云计算平台.该平台可供企业在互联网上运行应用,并可进行扩展.通过Windows Azure,企业能够在多个数据中心 ...

  9. dac mssql server

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  10. PHP SeasLog实现高性能日志记录

    https://www.jianshu.com/p/b5c01eb49df0 windows 安装 注意查看上面的信息 我标注了几个关键点  然后下载自己对应的 https://windows.php ...