iMX257引脚配置函数/内存读写函数

发布者:EnchantedDream最新更新时间:2024-08-13 来源: cnblogs 手机看文章 扫描二维码
随时随地手机看文章

要包含的三个头文件:

#include 'mx257_gpio.h'

#include 'mx25_pins.h'

#include 'iomux.h'

 

一、GPIO引脚使用

选择引脚模式->引脚配置->申请GPIO->设置引脚输入/输出->读取GPIO->释放引脚模式->

释放GPIO

1.选择引脚的模式(ALT0-ALT7)

int mxc_request_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)

void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg)

示例:    mxc_request_iomux(GPIO2_21, MUX_CONFIG_ALT5);

        mxc_free_iomux(GPIO2_21, MUX_CONFIG_ALT5);

        #define GPIO2_21    MX25_PIN_CLKO (定义在mx25_pin.h中)

 

2.设置引脚的配置

void mxc_iomux_set_pad(iomux_pin_name_t pin, u32 config)

示例:    mxc_iomux_set_pad(GPIO2_21, 0);

        #define GPIO2_21    MX25_PIN_CLKO (定义在mx25_pin.h中)

 

void mxc_iomux_set_gpr(iomux_gp_func_t gp, bool en);

This function enables/disables the general purpose function for a particular signal.

 

3.申请GPIO

int gpio_request(unsigned gpio, const char *label)

void gpio_free(unsigned gpio)

示例:    gpio_request(IOMUX_TO_GPIO(GPIO2_21), 'GPIO2_21');

        gpio_free(IOMUX_TO_GPIO(GPIO2_21));

 

4.设置引脚的输入输出模式:

相关文件:

    /drivers/gpio/gpiolib.c

    /arch/arm/plat-mxc/gpio.c

    /arch/arm/plat-mxc/include/mach/gpio.h

 

输入:int gpio_direction_input(unsigned gpio)

示例:gpio_direction_input(IOMUX_TO_GPIO(GPIO2_21));        //设置GPIO2_21为输入模式

#define GPIO2_21    MX25_PIN_CLKO (定义在mx25_pin.h中)

 

输出:int gpio_direction_output(unsigned gpio, int value)

示例:    gpio_direction_output(IOMUX_TO_GPIO(GPIO2_21), 0);     // GPIO2_21输出0

        gpio_direction_output(IOMUX_TO_GPIO(GPIO2_21), 1);    // GPIO2_21输出1

 

5.获取引脚的值

int gpio_get_value(unsigned int gpio)

注意:每次读取引脚的值时,必须先设置gpio引脚为输入模式

示例:    gpio_direction_input(IOMUX_TO_GPIO(GPIO3_15));

        data = gpio_get_value(IOMUX_TO_GPIO(GPIO3_15));

相关文件:

    arch/arm/plat-mxc/include/mach/gpio.h

    drivers/gpio/gpiolib.c

    arch/arm/plat-mxc/gpio.c

在gpio.h文件中

①定义了#define gpio_get_value __gpio_get_value(定义在 gpiolib.c中)

②在__gpio_get_value中调用chip->get,实际调用到的是 arch/arm/plat-mxc/gpio.c 文件中 mxc_gpio_get 函数

 

 

 

二、寄存器操作

1.内存映射、IO端口

#define iounmap(addr)                ((void)0)

#define ioremap(physaddr, size)            (physaddr)

#define ioremap_nocache(physaddr, size)        (physaddr)

#define ioremap_writethrough(physaddr, size)    (physaddr)

#define ioremap_fullcache(physaddr, size)    (physaddr)

 

2.读映射的内存、IO端口、读取字节端口(8bit)/字端口(16bit)/长字端口(32bit)

#define readb(addr) ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })

#define readw(addr) ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })

#define readl(addr) ({ unsigned long __v = (*(volatile unsigned long *) (addr)); __v; })

 

#define inb(addr)     readb (addr)

#define inw(addr)     readw (addr)

#define inl(addr)     readl (addr)

 

#define in_8(addr)     readb (addr)

#define in_be16(addr)     readw (addr)

#define in_be32(addr)     readl (addr)

 

#define inb_p(port)        inb((port))

#define inw_p(port)        inw((port))

#define inl_p(port)        inl((port))

或者:val = *((unsigned char*) (0xc00b0fe4));

io_mem = ioremap(0xfb000000,0x200000);

val = *((unsigned char*)(io_mem+0x100000));

 

3.写映射的内存、IO端口

#define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b))

#define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b))

#define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b))

 

#define outb(x, addr)    ((void) writeb (x, addr))

#define outw(x, addr)    ((void) writew (x, addr))

#define outl(x, addr)    ((void) writel (x, addr))

 

#define out_8(addr,x )     outb (x,addr)

#define out_be16(addr,x )    outw (x,addr)

#define out_be32(addr,x )    outl (x,addr)

 

#define outb_p(val, port)    outb((val), (port))

#define outw_p(val, port)    outw((val), (port))

#define outl_p(val, port)    outl((val), (port))

 

4.内存、IO端口拷贝

#define memset_io(a,b,c) memset((void *)(a),(b),(c))

#define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c))

#define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c))

拷贝时,源地址和目的地址会自动增长

示例:内存清零:memset_io(start,0,*size);

 

5.批量读取,读取一串字节/字/长字

(源, 目的, 大小)

static inline void io_insb (unsigned long port, void *dst, unsigned long count)

{

    unsigned char *p = dst;

    while (count--)

        *p++ = inb (port);

}

static inline void io_insw (unsigned long port, void *dst, unsigned long count)

{

    unsigned short *p = dst;

    while (count--)

        *p++ = inw (port);

}

static inline void io_insl (unsigned long port, void *dst, unsigned long count)

{

    unsigned long *p = dst;

    while (count--)

        *p++ = inl (port);

}

 

#define insb(a,b,l) io_insb(a,b,l)

#define insw(a,b,l) io_insw(a,b,l)

#define insl(a,b,l) io_insl(a,b,l)

示例:insb(adr, data, size);

 

6.批量写

(目的,源 , 大小)

static inline void io_outsb (unsigned long port, const void *src, unsigned long count)

{

    const unsigned char *p = src;

    while (count--)

        outb (*p++, port);

}

static inline void io_outsw (unsigned long port, const void *src, unsigned long count)

{

    const unsigned short *p = src;

    while (count--)

        outw (*p++, port);

}

static inline void io_outsl (unsigned long port, const void *src, unsigned long count)

{

    const unsigned long *p = src;

    while (count--)

        outl (*p++, port);

}

 

#define outsb(a,b,l) io_outsb(a,b,l)

#define outsw(a,b,l) io_outsw(a,b,l)

#define outsl(a,b,l) io_outsl(a,b,l)

示例: outsb(adr, data, size);


引用地址:iMX257引脚配置函数/内存读写函数

上一篇:调试分析之 imx257中proc下mymsg及myprintk的实现
下一篇:IMX257虚拟网卡vnet驱动程序

推荐阅读最新更新时间:2026-03-25 11:29

IMX257 LED驱动程序实现
由于昨天对IMX257的地址分配不了解,所以前面只能用s3c24xx的驱动程序来了解ioremap等对IO端口的工作原理。 但是经过昨晚对IMX257芯片的细细梳理,今天早上起来又把IMX257的芯片资料看了一遍,终于成功看懂了,下面意义给大家道来。 我们此处使用ERR_LED 也就是GPIO3_23引脚 一、IMX257 芯片资料分析 1.确定相关寄存器基址 确定IOMUX地址 GPIO3的地址 2.确定相关寄存器的偏移地址 IOMUX的相关的模式配置寄存器,配置为ALT5模式 偏移地址: 寄存器描述: 接下来就是配置GPIO的相关信息,上拉,CMOS输入输出,等信息 偏移地址: 寄存器描述:
[单片机]
<font color='red'>IMX257</font> LED驱动程序实现
IMX257 设备驱动模型之sysfs文件系统知识点整合(二)
前天我们实现了一个简单的sysfs的kobject的驱动程序,可是有没有发现很多东西都不懂,原因就是在我们对sysfs和kobject的工作原理不懂,虽然我一直不提倡整天接触那些乏味的知识点,也一直不喜欢谈论太多的知识点,但是有的时候,理论知识是实践的基础,有些基础的知识点还是不得不提,下面进入正题。 一、sysfs介绍 在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个虚拟文 件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交 互,该文件系统是当前系统上实际设备树的一个直观反
[单片机]
<font color='red'>IMX257</font> 设备驱动模型之sysfs文件系统知识点整合(二)
IMX257 总线设备驱动模型编程之设备篇
一、程序分析 1. 包含总线 既然我们的设备在总线上,自然我们既要包含总线了 如图所示,使用外部声明将我们的总线的结构体包含进来 2. 定义设备结构体 父目录为 my_bus 3. 定义属性文件结构体 属性文件结构体可以有一下得到: //产生后面的 bus_attr_version 结构体 static DEVICE_ATTR(dev,S_IRUGO,mydev_show,NULL); 如图所示: 4. 在初始化函数中 如图所示: 在初始化函数中, 先初始化设备的名字,这个名字用于于驱动名字进行匹配 然后注册设备,让系统认识这个设备,在/sys/device/my_bus0 下面就会有my_dev这个设备 最
[单片机]
<font color='red'>IMX257</font> 总线设备驱动模型编程之设备篇
IMX257 混杂设备miscdevice驱动程序
在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。 在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中。 一、混杂设备介绍 1. miscdevi
[单片机]
<font color='red'>IMX257</font> 混杂设备miscdevice驱动程序
构建Linux下IMX257 开发环境
  在linux下,我们可以有两种方法来实现:minicom 和 C-kerimit两种方法.   我刚开始使用的是minicom但是主要的原因是minicom使用的时缺出现乱码,也不知道是怎么回事,折腾了一会儿之后,没办法,就换成了C-kermit,经过实验,它确实是一个强大的软件.   C-kermit具体的安装方法此处不再介绍,可以在命令行$sudo apt-get install ckermit下载安装,简单点的也可以再linux自带的软件安装中实现.   安装完毕,接下来就是配置了. 1.配置kermit:   每个用户的kermit的配置文件在~/.mykermrc,如果这个文件不存在,则kermit会使用/etc/k
[单片机]
构建Linux下<font color='red'>IMX257</font> 开发环境
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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