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. 尝试用kotlin做一个app(写在前面)

    学kotlin的目的好像就是做一个app,不一定有什么想做的项目,只是单纯想掌握这一门技术,确切地说只是单纯想学会做app.对于概念的东西,我也没兴趣深究,用得到的学一下,用不到的,就算了.我也不知道 ...

  2. python刷LeetCode:14. 最长公共前缀

    难度等级:简单 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower",& ...

  3. APP分享视频H5页面

    男左女右中国APP需要做一个APP分享视频H5页面,效果图见下面的图. 出现的问题: (1)URL参数为中文的时候乱码: (2)vedio点击默认是QQ,微信的播放器: (3)给视频添加一个默认的封面 ...

  4. SpringCloud学习之Config分布式配置中心(八)

    统一配置中心概述 如果微服务架构中没有使用统一配置中心时,所存在的问题: 配置文件分散在各个项目里,不方便维护 配置内容安全与权限,实际开发中,开发人员是不知道线上环境的配置的 更新配置后,项目需要重 ...

  5. 腾讯大佬告诉你,写Python到底用什么IDE合适

    不管你是 Python 新手还是老鸟,肯定纠结过一个问题: 到底用什么编辑器写 Python 代码好? 为此,我们调查了数十位鹅厂程序猿们爱用的 Python IDE,从他们对每款编辑器的看法中,也许 ...

  6. 2020.2.21一些python总结

    #字符串前面加r可以防止字符串转义 \也可以防止字符串转义#三引号可以实现输入多行文本#range(start,end,step)#列表 append添加一个元素到末尾 extend 添加一个素组到末 ...

  7. 4. git目录探秘

    HEAD当前指向的分支信息.cconfig,当前仓库的配置信息,core,用户,远程,分支等信息.(命令操作其实就是修改当前config文件)refs---heads,其实就是分支,里面包含所有的分支 ...

  8. Thread--线程工作万花筒

    线程工作内存图. 线程状态.

  9. 合并两个django的queryset

    有queryset:A和B 要合并它们,根据网上的答案,貌似是用itertools库的chain对象比较好,地址 c=chain(x,y)   但是当c用于分页的时候,就有问题,会报chain没有le ...

  10. P3252 [JLOI2012]树

    题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不 ...