Linux下s3c6410的GPIO操作(7)

发布者:石头上种庄稼最新更新时间:2022-06-08 来源: eefocus关键字:Linux  s3c6410  GPIO操作 手机看文章 扫描二维码
随时随地手机看文章

没想到一个小小的GPIO操作函数,竟然写了七篇博客,这应该算是最后一篇了。


1、s3c6410的GPIO操作函数主要涉及到三个文件,如下所示:


arch/arm/plat-s3c64xx/gpiolib.c


linux/arch/arm/plat-s3c/gpio.c


linux/arch/arm/plat-s3c/gpio-config.c


这三个文件中的很多函数都已经讲到了,可以说基本上都讲了,当然,下面这两个函数没讲:


int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)


{

struct s3c_gpio_chip *chip =s3c_gpiolib_getchip(pin);


这个函数根据pin的引脚编号,得到对应的struct s3c_gpio_chip结构体,源码如下:


static inline struct s3c_gpio_chip *s3c_gpiolib_getchip(unsigned int chip)

{

return (chip < S3C_GPIO_END) ? s3c_gpios[chip] : NULL;

}


struct s3c_gpio_chip *s3c_gpios[S3C_GPIO_END];这个数组大家,应该还有印象。




unsigned long flags;

int offset;

int ret;



if (!chip)

return -EINVAL;



offset = pin - chip->chip.base;得到偏移量



local_irq_save(flags);

ret = s3c_gpio_do_setcfg(chip, offset, config);


这函数源码如下:

/* As a note, all gpio configuration functions are entered exclusively, either

 * with the relevant lock held or the system prevented from doing anything else

 * by disabling interrupts.

*/

static inline int s3c_gpio_do_setcfg(struct s3c_gpio_chip *chip,

    unsigned int off, unsigned int config)

{

return (chip->config->set_config)(chip, off, config);

}


通过这调用具体的函数。例如:


static struct s3c_gpio_cfg gpio_4bit_cfg_noint = {

.set_config= s3c_gpio_setcfg_s3c64xx_4bit,

.set_pull  = s3c_gpio_setpull_updown,

.get_pull  = s3c_gpio_getpull_updown,

};


local_irq_restore(flags);



return ret;

}


2、看另外一个函数,源码如下:

int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)

{

struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);

unsigned long flags;

int offset, ret;



if (!chip)

return -EINVAL;



offset = pin - chip->chip.base;



local_irq_save(flags);

ret = s3c_gpio_do_setpull(chip, offset, pull);

local_irq_restore(flags);



return ret;

}


其他的和前一个函数都很类似,我们只看这部分


static inline int s3c_gpio_do_setpull(struct s3c_gpio_chip *chip,

     unsigned int off, s3c_gpio_pull_t pull)

{

return (chip->config->set_pull)(chip, off, pull);

}


也是调用具体的函数,如下


static struct s3c_gpio_cfg gpio_4bit_cfg_noint = {

.set_config  = s3c_gpio_setcfg_s3c64xx_4bit,

.set_pull= s3c_gpio_setpull_updown,

.get_pull  = s3c_gpio_getpull_updown,

}


EXPORT_SYMBOL(s3c_gpio_cfgpin);

EXPORT_SYMBOL(s3c_gpio_setpull);


终于可以松口气了,GPIO操作函数以及所涉及的文件都已分析完了,可是要告诉大家一个不幸的消息,其实我们费那么多事,其实在实际运用中,也可不用这些函数,只需要下面这些就可以了,究竟是什么呢?其实,大家想一下,不就是对IO寄存器的操作吗?直接对其直接进行不也是一样的吗,何必费那么多事。包装真可怕!


#define __raw_writeb(v,a)(__chk_io_ptr(a), *(volatile unsigned char __force  *)(a) = (v))

#define __raw_writew(v,a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v))

#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a) = (v))



#define __raw_readb(a) (__chk_io_ptr(a), *(volatile unsigned char __force  *)(a))

#define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))

#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))


关键字:Linux  s3c6410  GPIO操作 引用地址:Linux下s3c6410的GPIO操作(7)

上一篇:s3c6410的UART设备驱动(4)
下一篇:Linux下s3c6410的GPIO操作(6)

推荐阅读最新更新时间:2024-11-20 10:58

Linux的启动和核心介绍
这是一次对Linux介绍后的整理。   对象是一些刚对Linux核心感兴趣,并且准备进一步研究和改造的同志。   因为是由提纲整理而成,有些乱,见谅!       四部分内容:   一、Linux核心源码结构介绍   二、编译和配置的过程   三、系统启动顺序的相关文件   四、核心改造的一些经验   一、   当我们安装好一个Linux系统,通常核心源码存放在/usr/src/linux/目录。   下面先看看这目录下的各个子目录及文件。    #cd /usr/src/linux    #ls -aF   ./ MAINTAINERS drivers/ kernel/ scripts/   ../ Makefile fs/ li
[嵌入式]
[linux kernel] 内核下ksz9031驱动调试踩过的坑
系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 -linux4sam_6.0 板子型号:at91sama5d3x-xplained MCU型号:sama5d36 内核中调试驱动,和uboot中会有些区别,因为内核启动过程是顺序启动的,硬件上电后,外部的器件要快速做好准备工作,内核代码初始化到这个器件如果器件没有完成上电复位,很可能会驱动失败,需要硬件和软件时序同步,这是非常重要的一点。 【Datasheet】PHY KSZ9031千兆网络芯片解读 U-bo
[单片机]
基于S3C2440嵌入式Linux的步进电机驱动程序
在嵌入式Linux开发过程中需要为指定设备编写和编译驱动程序,这与以往在PC机上的Linux驱动开发明显不同,本文设计了基于S3C2440嵌入式Linux下激光雕刻系统的步进电机驱动程序。 1 硬件系统的设计 步进电机开环控制系统主要由中央控制器、步进电机驱动器、传感器以及步进电机四大部分组成。本系统采用基于ARM920t内核的S3C244 0A微处理器作为控制系统的中央控制器,该芯片主频400MHz,最高可达到533MHz,内含多种设备接口,存储器使用64MB的Nand Flash和64MB的SDRAM。图1所示为控制系统框图。 2 系统的工作原理 本系统主要控制两个两相混合式步进电机,分别代表X轴和Y
[工业控制]
基于S3C2440嵌入式<font color='red'>Linux</font>的步进电机驱动程序
avr+开发环境+linux,win7下avr单片机开发环境的搭建
操作系统:win7 professional x86 开发软件:avr studio 4.19 首先下载avr studio 4.19,因为貌似这是atmel官方最后支持jtag ice的开发环境。而且也就只有这个4的版本才支持win7,正好本人有个jtag,所以果断选择这个版本了。 相关软件下载地址: 貌似这个里面有很多常见的工具下载。 刚开始我是用的avr studio 4.19+WinAVR-20100110这个环境搭建的开发环境。 但是问题出现了,编译文件时出现了找不到编译器。出现如下的错误: make: Makefile: No such file or directory avr-objcopy: 'mai
[单片机]
avr+开发环境+<font color='red'>linux</font>,win7下avr单片机开发环境的搭建
Linux操作系统开始在移动电话上得到应用
尽管Linux的胜利一直相当低调,但它确实已经在消费电子设备领域得到了广泛采用,范围从索尼的高清电视和TiVo的数字摄像机到LinkSys和D-Link等公司的家庭联网设备。与内部组件经常暴露在外的PC不同,Linux埋藏在设备之内,对于终端用户而言它几乎是不可见的。 至今,Linux真正的成功故事也许是它在移动设备领域的应用。随着半导体产品性能和效率的不断提高,今天的移动设备正在迅速提升其功能和复杂性。尤其是,随着移动设备开始超越昨天的PC功能,且出货量也大大超过后者(大于5:1),移动电话正在成为下一代的客户端设备。但这一趋势同时也带来了大量的问题,市场成熟度就是其中之一。 移动电话市场的成熟正引起早期入市和新近入行
[应用]
Android代码首次与Linux 3.3内核融合
        据外电报道,最新3.3版本的Linux内核中包括一些Google Android代码。这对两个开源项目都有所帮助。Linux内核项目主管李纳斯·托沃兹(Linus Torvalds)昨天公布最新版内核,它将两个开源世界相连。Linux 3.3版本的内核结束了两个项目孤立的时代。     在表面之下,每一台Andorid手机也将成为Linux手机。在开发Android程序时,程序员一般用的是Java式的界面,但在一些细节方面用的是Google定制版Linux,比如键盘输入、多任务等。     在将二者融合之后,如果一切顺利,将使得编程更为容易,让参与开发的各方进程更快。Google也会受益,它可更快使用L
[手机便携]
基于Android系统的H.264视频压缩技术实现
视频服务器在目前视频领域中的应用,主要是利用网络视频服务器构建远程监控系统。基于网络视频服务器的多通道数字传播技术,具有传统的模拟视频输出系统无可比拟的诸多优势。但要使网络视频监控得到普及还有待于解决以下问题:尽快提高视频压缩的技术水平,目前先进的压缩标准H.264可以部分解决视频质量和网络带宽占用这个矛盾。 H.264/AVC标准是一种高性能的视频编解码技术,相比以前的标准,具有更高的压缩率、高质量图像、容错功能、并有很强的网络适应性。 随着Android技术的迅猛发展和日趋成熟,其开放性、便携性、良好的兼容性、无缝结合网络通信等特点将使Android操作系统在未来工业领域中有广泛的应用。 1 系统概述 基于An
[嵌入式]
S5PV210开发 -- Linux dd命令
昨天群里有人询问,为什么破坏 BootLoader 破坏不掉。 出现错误:dd: writing '/dev/mtdblock0': Operation not permitted 我说需要插着 SD卡才可以。(这个也不对,不插SD卡也可以,那这个错误还是没有搞清楚) 然后我们来看一下它操作指令: busybox dd if=/dev/zero of=/dev/mmcblk0 bs=512 seek=1 count=1 conv=sync 为了确保执行数据有效,再执行 sync 同步一下,即可破坏掉前一个块的数据。 进而引出了我们今天要讲的 dd命令。 参看:Linux dd命令
[单片机]
S5PV210开发 -- <font color='red'>Linux</font> dd命令
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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