4412 GPIO初始化

发布者:ShiningSmile最新更新时间:2022-01-27 来源: eefocus关键字:GPIO  初始化 手机看文章 扫描二维码
随时随地手机看文章

一、GPIO的初始化

• 在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpioexynos4”被编译进了内核.通过搜索*.o文件,可以知道内核编译内哪些文件。针对的看可以简化很多。
– 生成.o文件代表最终被编译进了内核
– 除了menuconfig配置文件,还可以通过.o文件来判定该文件是否编译进了


ls drivers/gpio/*.o


内核

• 在“gpio-exynos4.c”文件最下面一行
– core_initcall(exynos4_gpiolib_init);
– core_initcall代表在linux初始化过程中会调用
– 初始化函数是在源码目录下“include/linux/init.h”文件中定义的,该头文件中定义了一系列的初始化函数,在linux启动的过程中会按等级

init.h文件相关部分

 * A "pure" initcall has no dependencies on anything else, and purely

 * initializes variables that couldn't be statically initialized.

 *

 * This only exists for built-in code, not for modules.

 */

#define pure_initcall(fn)               __define_initcall("0",fn,0)


#define core_initcall(fn)               __define_initcall("1",fn,1)

#define core_initcall_sync(fn)          __define_initcall("1s",fn,1s)

#define postcore_initcall(fn)           __define_initcall("2",fn,2)

#define postcore_initcall_sync(fn)      __define_initcall("2s",fn,2s)

#define arch_initcall(fn)               __define_initcall("3",fn,3)

#define arch_initcall_sync(fn)          __define_initcall("3s",fn,3s)

#define subsys_initcall(fn)             __define_initcall("4",fn,4)

#define subsys_initcall_sync(fn)        __define_initcall("4s",fn,4s)

#define fs_initcall(fn)                 __define_initcall("5",fn,5)

#define fs_initcall_sync(fn)            __define_initcall("5s",fn,5s)

#define rootfs_initcall(fn)             __define_initcall("rootfs",fn,rootfs)

#define device_initcall(fn)             __define_initcall("6",fn,6)


• 初始化函数调用了“exynos4_gpiolib_init”
• 通过软件source insight查找到exynos4_gpiolib_init函数的定义
• 在该函数中引用了chip = exynos4_gpio_common_4bit结构体
• 查找到结构体exynos4_gpio_common_4bit
• 可以看到结构体中有S5P_VA_XXXX的基地址定义,VA一般用来代表虚拟地址 

以有带有label= "GPL2"的结构体为例 

 

 

结构体exynos4_gpio_common_4bit 

• .base = (S5P_VA_GPIO2 + 0x100)
– 表示偏移地址和虚拟地址相加
• .eint_offset = 0x20
– 表示中断部分,介绍中断的时候再讲(IO口可以配置为中断模式)
• .group = 22
– 给GPIO分组
• chip.base = EXYNOS4_GPL2(0),
– 宏定义EXYNOS4_GPL2(0)赋值给初始化函数
• chip.ngpio = EXYNOS4_GPIO_L2_NR
– 表示这一小组中有几个GPIO
• chip.label = "GPL2",
– 程序员需要关心的标志

• 宏定义EXYNOS4_GPL2(0)分析
– EXYNOS4_GPL2(_nr) (EXYNOS4_GPIO_L2_START + (_nr))
– 枚举GPIO
– EXYNOS4_GPIO_L2_START= EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_L1)
– EXYNOS4_GPIO_NEXT宏定义
– #define EXYNOS4_GPIO_NEXT(__gpio) ((__gpio##_START) + (__gpio##_NR)
+ CONFIG_S3C_GPIO_SPACE + 1)
• GPIO的数量EXYNOS4_GPIO_L2_NR
– 可以通过手册查到 
• S5P_VA_GPIO2

虚拟地址

• 查找S5P_VA_GPIO2宏定义,可以看到所有的GPIO被分为4个bank,这
个和datasheet上面是一致的。
– S5P_VA_GPIO1
– S5P_VA_GPIO2 S3C_ADDR(0x02240000)
– S5P_VA_GPIO3
– S5P_VA_GPIO4
• 查找到S3C_ADDR宏定义
– #define S3C_ADDR(x) (S3C_ADDR_BASE + (x))
• 查找到S3C_ADDR_BASE宏定义,这是一个虚拟地址,可以看出,地址
范围超出了1G或者2G内存的范围
– #define S3C_ADDR_BASE 0xF6000000 

虚拟地址和物理地址映射

– 虚拟地址一般很好查找,一般在平台相关gpio的文件中就可以找到宏定义
• 在source insight中搜索关键字“S5P_VA_GPIO2”,看看那里用到了这个宏定义。搜索时间会比较长,1-5分钟吧。
• 搜索出来之后,可以看到除了gpio-exynos4.c文件中使用,cpu-exynos中也使用了,这是一个平台文件

 

• 结构体解释
– .virtual = (unsigned long)S5P_VA_GPIO2,表示虚拟地址

– .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO2),表示物理地址

– .length = SZ_4K,表示映射的宽度

– .type = MT_DEVICE,

• 查找到宏定义EXYNOS4_PA_GPIO2

#define EXYNOS4_PA_GPIO2  0x11000000

这个物理地址0x11000000就是

 

• 初始化过程简单描述
– 平台文件分别定义好物理地址和虚拟地址
– 物理地址和虚拟地址之间映射
• 在初始化中,引入了程序员需要使用的GPIO宏定义,并将宏定义装入chip结构体中

 

GPIO的调用函数

• 例如头文件gpio-cfg.h中s3c_gpio_cfgpin函数。这个函数是给GPIO做配置,第一个参数是宏EXYNOS4_GPL2(0),第二个是配置的状态参数
– 配置头文件在arm/arm/plat-samsung/include/plat/gpio-cfg.h
• 查找该函数,可以看到进入函数就会调用chip结构体
– s3c_gpiolib_getchip,这个函数通过pin调用之后,会返回s3c_gpios[chip] 的参数
– exynos4_gpio_common_4bit[]和s3c_gpios都是结构体s3c_gpio_chip类型的数据
– 然后计算偏移地址等等一系列操作,这一部分是linux内核以及三星平台完成的,具体细节不用管。

• 也就是我们控制GPIO的时候,可以通过GPIO的一些处理函数加上类似EXYNOS4_GPL2(0)的宏定义,就可以操作GPIO
• 后面再具体介绍GPIO操作中,常用函数的使用

• 不是说好的分页大小要一样,怎么GPIO经过mmu处理的时候,又有SZ_256又有SZ_4K?
– 实际上CPU查找地址的时候,仍旧是通过内存。mmu本身不保存具体的数据,主要是提供一个虚拟地址和物理地址的表格,表格中还有字段的长度。这个分页和mmu没什么关系,是CPU内存以及物理地址之间通信使用
的概念。这个只是一个抽象的概念,理解mmu只是一个表格,CPU对GPIO的操作就很好理解了。 

常见问题

• 内部寄存器不是很快么,CPU为什么不直接读取?
– 内部寄存器是很快,但是相对于CPU还是非常慢。CPU处理数据是将内存中一大段一大段处理,如果单个的读取内部寄存器的值,对CPU是极大的浪费。把内部寄存器也看成“特殊的物理地址”即可。
• 只讲了虚拟地址和物理地址对应数组,怎么没介绍哪里调用了?
– 大家可以看一下函数ioremap,linux会调用这个函数来实现gpio的映射关系
– 今天讲的已经够多够深入了,大家只要能够理解这么一层意思就可以了,这个东西对我们实际写驱动的帮助其实不是那么大! 
• 如果我还是理解不了“对宏定义EXYNOS4_GPL2(0)的操作就是对4412芯片管脚AC21寄存器的操作”,怎么办?
– 记住这个结论,能够将宏变量EXYNOS4_GPL2(0)和GPL这一组GPIO的第0位寄存器联想起来。
– 后面跟着我依葫芦画瓢,不影响大家实际写程序,有兴趣再回过头理解 

二、LED驱动

原理简单介绍

• 三极管(NPN锗管)
– “电流控制电流源”
– 三极端CE间的电阻可变,可以把Rce看成一个可调电阻,可调电阻的变量是电源
• IO管脚拉高之后,BE之间达到一定电流,可变电阻Rce就从无限大降低到大概几百欧姆。
– 高电平灯亮,低电平灯灭 

头文件

• Linux中申请GPIO的头文件
– include/linux/gpio.h
• 三星平台的GPIO配置函数头文件

– arch/arm/plat-samsung/include/plat/gpio-cfg.h
– 包括三星所有处理器的配置函数
• 三星平台EXYNOS系列平台,GPIO配置参数宏定义头文件
– arch/arm/mach-exynos/include/mach/gpio.h
– GPIO管脚拉高拉低配置参数等等
– 配置参数的宏定义应该在arch/arm/plat-samsung/include/plat/gpio-cfg.h文件中
• 三星平台4412平台,GPIO宏定义头文件。已经包含在头文件gpio.h中
– arch/arm/mach-exynos/include/mach/gpio-exynos4.h
– 包括4412处理器所有的GPIO的宏定义


leds_module

#include

#include


/* device register header file, include device and driver struct

 * register and remove function */

#include

/* register misc device header file */

#include

/* register deivce node file operations struct */

#include


/* linux gpio header file */

#include

/* samsung gpio config file */

#include

/* exynos gpio config header file */

#include

/* 4412 gpio header file */

#include


#define DRIVER_NAME "hello_ctl"

#define DEVICE_NAME "hello_ctl"


MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("TOPEET");


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

{

        printk(KERN_EMERG "hello openn");

        return 0;

}


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

{

        printk(KERN_EMERG "hello releasen");

        return 0;

}


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

{

        printk(KERN_EMERG "cmd is %u, arg is %lun", cmd, arg);


        if(cmd > 1 || arg > 1) {

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

                return 0;

        }


        gpio_set_value(EXYNOS4_GPL2(0), cmd);


        return 0;

}


static struct file_operations  hello_ops = {

        .owner   = THIS_MODULE,

        .open    = hello_open,

        .release = hello_release,

        .unlocked_ioctl = hello_ioctl,

};


static struct miscdevice hello_dev = {

        .minor = MISC_DYNAMIC_MINOR,

        .name  = DEVICE_NAME,

        .fops  = &hello_ops,

};


static int hello_probe(struct platform_device *pdv)

{

        int ret;

        printk(KERN_EMERG "tinitializedn");


        /* set up gpio */

        ret = gpio_request(EXYNOS4_GPL2(0), "LEDS");

        if(ret < 0) {

                printk(KERN_EMERG "gpio_request EXYNOS4_GPL2(0) failedn");

                return ret;

        }


        s3c_gpio_cfgpin(EXYNOS4_GPL2(0), S3C_GPIO_OUTPUT);


        gpio_set_value(EXYNOS4_GPL2(0), 0);


        /* register */

        misc_register(&hello_dev);


        return 0;

}


static int hello_remove(struct platform_device *pdv)

{

        printk(KERN_EMERG "tremoven");

        misc_deregister(&hello_dev);

        return 0;

}


static void hello_shutdown(struct platform_device *pdv)

{


}


static int hello_suspend(struct platform_device *pdv, pm_message_t state)

{

        return 0;

}


static int hello_resume(struct platform_device *pdv)

{

        return 0;

}


struct platform_driver hello_driver = {

        .probe    = hello_probe,

        .remove   = hello_remove,

        .shutdown = hello_shutdown,

        .suspend  = hello_suspend,

        .resume   = hello_resume,

        .driver = {

                .name  = DRIVER_NAME,

                .owner = THIS_MODULE,

        }

};


static int hello_init(void)

{

        int DriverState;


    printk(KERN_EMERG "Hello world enter!n");

        DriverState = platform_driver_register(&hello_driver);


        printk(KERN_EMERG "tDriverState is %dn", DriverState);

[1] [2] [3] [4]
关键字:GPIO  初始化 引用地址:4412 GPIO初始化

上一篇:4412 内核模块传参数
下一篇:4412 物理地址

推荐阅读最新更新时间:2024-11-13 10:38

tiny4412开发板icache操作程序
首先,来介绍关于cache的概念。 cache的作用: 基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。这个介于主存和CPU之间的高速小容量存储器称作高速缓存存储器(Cache)。 启用Cache后,CPU读取数据时,如果Cache中有这个数据的复本则直接返回,否则从主存中读入数据,并存入Cache中,下次再使用(读/写)这个数据时,可以直接使用Cache中的复本。 启用Cache后,CPU写数据时有写穿式和回写式两种方式。 (1)写穿式(Wri
[单片机]
tiny4412 串口驱动分析三 --- log打印的几个阶段之内核自解压
开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 内核自解压时期的串口打印 在zImage格式的内核启动时会自解压内核,此时打印信息如下: Uncompressing Linux... 这句话是在arch/arm/boot/compressed/misc.c中: void decompress_kernel(unsigned long output_start, unsigned lo
[单片机]
tiny<font color='red'>4412</font> 串口驱动分析三 --- log打印的几个阶段之内核自解压
S3C2440中的GPIO
1.S3C2440GPIO简单介绍 GPIO即General-purpose input/output ,这些管脚除了可以用作输入输出外,还可以配置成一些其他的功能,例如I2C,UART等,其实就是管脚复用的思想。 所有的这些管脚主要通过下面的寄存器进行控制, 2.JZ2440原理图 从上面的原理图截图中我们可以看到: 1.我们的nLED_1,nLED_2,nLED_4是连接到3.3V电源上的,所以我们的管脚需要输出低电平,LED灯才会亮。 2.我们的nLED_1,nLED_2,nLED_4是连接到s3c2440的GPF4,GPF5,GPF6上面的。 另外,在原理图中还有如下知识点。 3.控
[单片机]
S3C2440中的<font color='red'>GPIO</font>
STM32单片机GPIO口配置问题
  在学习STM32F单片机时,我们常常困惑什么时候才能叫入门,采用什么样的教材入门,或者采用什么的编程软件。在学习类的教材中,以神州,原点教材布局很多,但是相信很多人看到这类教材也是一头雾水,需要你花费巨大的精力从寄存器的最底层去学习和了解,学习时间还是相对漫长。在采用的编程软件中,KEIL和IAR各有优势吧,在这里我选用的是KEIL。   在开始学习编程时,我采用的是库函数开发指南。在安装完成KEIL软件和添加项目工程时,就开始学习库函数编程。   在编写一个GPIO口控制时,首先我们要知道我们要实现的功能,连接的IO口和怎么配置GPIO口。最常见的以LED举例来说。比如我采用PB13引脚连接LED灯的负极,按照硬件的
[单片机]
8051单片机的UART0串口初始化
1、C8051f的UART0是异步、全双工串口。其波特率发生器规定由定时器1定时器提供。可配置为8位UART或9位UART(多机通讯第九位用于片选作用)。SYSCLK=24.5MHZ(我的板子采用内部晶振频率作为系统时钟) BAUDRATE=115200(波特率) 2、初值TH1 Tl1配置 由上述公式可计算初值:TH1 = 256-(SYSCLK/BAUDRATE/2)而程序内是TH1 = -(SYSCLK/BAUDRATE/2),这两种是相同的。第一种是以正数的二进制形式保存在计算机内。第二种是负数,取反加1求得补码保存在计算机中。结果是相同的。每当TL1中的值溢出后 TH1存储的重装载值装载到TL1中开始计数。
[单片机]
8051单片机的UART0串口<font color='red'>初始化</font>
串口编程(基于tiny4412
参考: http://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html http://www.cppblog.com/amazon/archive/2010/01/28/106644.html serial_demo.c #include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h //文件控制定义 #include termios.h //终端控制定义 #include errno
[单片机]
助力车载驾驶系统更灵活 纳芯微推出车规级I²C GPIO扩展器件NCA9539-Q1
2022年9月28日 – 纳芯微宣布(NOVOSENSE)推出全新车规I²C GPIO扩展芯片NCA9539-Q1,可通过I²C扩展16个GPIO通道,广泛适用于汽车座舱娱乐系统、汽车辅助驾驶系统、车身电子、新能源汽车动力总成等模块,工作温度可高达125度,且能在严苛要求的汽车领域提供更强抗干扰能力,同时有效降低了成本,为客户解决了成本与性能兼备的双向需求。 该产品已通过AEC-Q100(Grade1)可靠性认证,从设计、制造到封装测试实现了国产化全流程,确保供应的安全与可靠,以更好地满足客户的交付需求。 更简明的方案 NCA9539-Q1是一款汽车级24引脚CMOS器件,提供16位通用并行I²C总线数输入/输
[汽车电子]
助力车载驾驶系统更灵活 纳芯微推出车规级I²C <font color='red'>GPIO</font>扩展器件NCA9539-Q1
关于STM32GPIO工作模式
一:转载链接(基于正点原子开源电子网):http://www.openedv.com/posts/list/21980.htm 二:转载学习内容如下:(本人作为学习笔记) 浮空,顾名思义就是浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了. 开漏,就等于输出口接了个NPN三极管,并且只接了e,b. c极 是开路的,你可以接一个电阻到3.3V,也可以接一个电阻到5V,这样,在输出1的时候,就可以是5V电压,也可以是3.3V电压了.但是不接电阻上拉的时候,这个输出高就不能实现了. 推挽,就是有推有拉,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻. (1)GPIO_Mode_AIN 模拟输
[单片机]

推荐帖子

【转帖】嵌入式开发学习步骤-4412开发板学习指引
转自iTOP-4412讨论群:这部分内容主要是关于TFTP服务器的搭建,特别单独拿出来讲解一下。一、TFTP服务器的搭建与测试:TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现。嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server(服务器)支持,二是嵌入式目标系统的tftp-client(客户端)支持。因为u-boot本身内置支持tftp-client,所以嵌入式目标
mucheni 嵌入式系统
led书写点阵屏设计
谁做过LED书写点阵啊,求各位大神帮助啊,或者采集led显示屏点阵亮灭的信息,急求急求。。。。led书写点阵屏设计先利用关键词搜索下啊,看看有没有类似的资料
LED点阵 单片机
刚接触STM32,谁能帮我用SYStick做一个 持续一秒进入一次中断的定时器
如题,谢谢刚接触STM32,谁能帮我用SYStick做一个持续一秒进入一次中断的定时器#includestm32f10x.h//#includestm32f10x_gpio.h#defineRCC_GPIO_LEDRCC_APB2Periph_GPIOF#defineGPIO_LED_PORTGPIOF#defineGPIO_LED1GPIO_Pin_6#d
飞翔的兔子 stm32/stm8
关于8255A控制步进电机的运动,仿真不出来,请高手指点,内附程序
本人现在做一个项目,其中一部分是用8255的A口控制步进电机的运动,采用的计时器0中断的方式,即每一次进入中断,就将数发送到8255的A口输出,去控制电机,在仿真的时候数没办法送进去。大致的程序如下,由于是整个项目中的一部分,我就截取相关的一部分:#defineCOM8255XBYTE#definePA8255XBYTE#definePB8255XBYTE#definePC8255XBYTE//初始化ucharcodebapai={0x0e,0x0c
zhf120 单片机
STM32F103的C,D,E支持ISP吗?
STM32F103的C,D,E支持ISP吗?YES如果真是象谣传的这样,那怎么做产品呀,请赶快澄清一下吧听说STM32103CDE代码加密有问题?即使有问题也要说出个所以然,无中生有的东西如何澄清?谣传说什么问题?不要空穴来风嘛呵呵,谁主张,谁举证...只是我看了:“各位用过的兄弟:STM32生产时怎么设置保密
hxxhxx stm32/stm8
柔性线路板电路用覆铜好一点还是银浆更好?
在柔性线路板(FPC)上,选择覆铜还是银浆取决于电路的应用需求和成本考虑。两者各有优缺点:1.导电性:覆铜:覆铜导电性更强,能够承载更高的电流,因此在需要高导电性、低电阻的电路中,覆铜效果更佳。银浆:银浆的导电性较覆铜略低,更适合电流较小的电路。但由于银的本质导电性较好,对于低电流需求的柔性电路,银浆依然可以满足需求。2.耐用性和可靠性:覆铜:耐用性和粘附性更高,在高温、潮湿等环境下表现稳定,适合要求较高的耐久性应用。银浆:银浆线路在使用过程中可能会受环境影响(如氧化或湿度
嘉立创FPC PCB设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved