首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在用户空间ARM9 Embedded Linux AM1808中处理GPIO

在用户空间ARM9 Embedded Linux AM1808中处理GPIO
EN

Stack Overflow用户
提问于 2013-03-26 18:19:32
回答 2查看 1.4K关注 0票数 3

我必须将我的GSM模块与基于ARM9的AM1808接口。

我已经将所有的GPIO引脚分配给Da850.c以及mux.h文件。我成功地创建了一个uImage,并将该图像插入到我的闪存中。

我需要处理一些来自用户应用程序的GPIO。

我知道我们可以从Kerel空间处理GPIO,但我需要从用户空间处理。

例如,我已经为GSM模块分配了一个电源按键的GPIO。我需要通过应用程序更改引脚的方式(高或低)。

好的,我已经写了下面的代码来从用户空间访问它,

代码语言:javascript
复制
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <unistd.h>
#include "GSMpwr.h"
#define BS_GSM_PWR_REGISTER 0x01E26014
#define BS_DCDS_MASK    0x00000004

int fd;  // Memory device descriptor
unsigned long *pPWR;

unsigned short GetGSMpwr(void)
{
    #if defined __HOST_ARM
    unsigned long dcd_value = *pPWR;
    return (pwr_value >> 7) & 0x01;
    #endif
}

void InitializeGSMpwr(void) 
{
    #if defined __HOST_ARM
    int page_size = getpagesize();
    unsigned int MAP_addr;
    unsigned int reg_addr;
    unsigned char *pTemp;             // Pointer to GSMpwr register

/*
 * Open memory and get pointer to GSMpwr register in the FPGA
 */

if((fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0)
{
        printf("failed to open /dev/mem");
        return;
}
else
{
    MAP_addr = (BS_GSM_PWR_REGISTER & ~(page_size - 1));
    pTemp = (unsigned char *)mmap(NULL, page_size,(PROT_READ |      PROT_WRITE),MAP_SHARED,fd,MAP_addr);

    if((pTemp == MAP_FAILED) || (pTemp == NULL))
    {
        printf("failed to map /dev/mem");
        return;
    }
    else
    {
    printf(“Memory Mapped at Address %p. \n”,pTemp);
    }

virt_addr = map_base + (control & MAP_MASK);



    reg_addr = (BS_GSM_PWR_REGISTER & (page_size - 1));
    pPWR = (unsigned long*)(pTemp + reg_addr);
    printf("GSM PWR PIN mapped in Application\n");
}

我只能通过这段代码读取这个引脚,现在我想使用这个引脚作为输出,并希望以3秒的时间间隔来设置高和低。

EN

回答 2

Stack Overflow用户

发布于 2013-03-26 18:37:38

最简单的方法是利用sysfs中的GPIO支持,在那里你可以控制所有导出的GPIO。请看一下kernel GPIO documentation,特别是Sysfs Interface for Userspace部分。

sysfs (GPIO_SYSFS)中启用GPIO支持后,GPIO控制将非常简单,如下所示:

示例

代码语言:javascript
复制
GPIO=22

cd /sys/class/gpio
ls
echo $GPIO > /sys/class/gpio/export
ls

请注意,在第一个ls中,gpio22并不存在,但是在将GPIO22导出到用户空间之后就存在了。

代码语言:javascript
复制
cd /sys/class/gpio/gpio$GPIO
ls

有设置方向和检索当前值的文件。

代码语言:javascript
复制
echo "in" > direction
cat value

您可以为输出配置GPIO,也可以设置值。

代码语言:javascript
复制
echo "out" > direction
echo 1 > value

示例取自here

票数 10
EN

Stack Overflow用户

发布于 2013-07-19 15:54:03

我得到了它,请找到下面的代码,我得到了具体的引脚地址,我已经访问了该引脚如下,

代码语言:javascript
复制
unsigned short   GetGSMpwr(void)
 {
    unsigned long pwr_value = *pPWR;
    printf("GSM_PWR:check Start : %ld",pwr_value);
return (pwr_value >> 1) & 0x01;
 }

 unsigned short SetGSMpwr(void)
{
    unsigned long pwr_value = *pPWR;
    printf("GSM_PWR:check Start : %ld",pwr_value);
   *pPWR = ~((pwr_value >> 1) & 0x01);
}

unsigned short ClrGSMpwr(void) 
{
    unsigned long pwr_value = *pPWR;
    printf("GSM_PWR:check Start : %ld",pwr_value);
   *pPWR = 256;
}`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15642429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档