Embedded 在用户空间ARM9嵌入式Linux AM1808中处理GPIO

Embedded 在用户空间ARM9嵌入式Linux AM1808中处理GPIO,embedded,arm,embedded-linux,Embedded,Arm,Embedded Linux,我必须将我的GSM模块与基于ARM9的AM1808接口 我已将所有GPIO引脚分配给Da850.c以及mux.h文件。我成功地创建了一个uImage并将其插入到我的flash中 我需要处理一些来自用户应用程序的GPIO 我知道我们可以从Kerel空间处理GPIO,但我需要从用户空间处理 cd /sys/class/gpio/gpio$GPIO ls 例如,我为GSM模块分配了电源键的GPIO。我需要通过应用程序更改pin的方式(高或低) 好的,我已经编写了以下代码从用户空间访问它 #inclu

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

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

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

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

cd /sys/class/gpio/gpio$GPIO
ls
例如,我为GSM模块分配了电源键的GPIO。我需要通过应用程序更改pin的方式(高或低)

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

#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");
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“GSMpwr.h”
#定义BS_GSM_PWR_寄存器0x01E26014
#定义BS_DCDS_掩码0x00000004
int fd;//内存设备描述符
无符号长*pPWR;
无符号短GetGSMpwr(无效)
{
#如果已定义uu主机u手臂
无符号长dcd_值=*pPWR;
返回(pwr_值>>7)&0x01;
#恩迪夫
}
无效初始化EGSMPWR(无效)
{
#如果已定义uu主机u手臂
int page_size=getpagesize();
无符号整数映射地址;
无符号整数寄存器地址;
unsigned char*pTemp;//指向GSMpwr寄存器的指针
/*
*打开内存并获取指向FPGA中GSMpwr寄存器的指针
*/
如果((fd=open(“/dev/mem”,O|RDWR | O|u SYNC))<0)
{
printf(“未能打开/dev/mem”);
返回;
}
其他的
{
MAP_addr=(BS_GSM_PWR_寄存器&~(page_size-1));
pTemp=(无符号字符*)mmap(空,页面大小,(保护读写),映射共享,fd,映射地址);
if((pTemp==MAP_失败)| |(pTemp==NULL))
{
printf(“映射/dev/mem失败”);
返回;
}
其他的
{
printf(“在地址%p处映射的内存。\n”,pTemp);
}
virt_addr=map_base+(控制和映射掩码);
注册地址=(BS_GSM_PWR_寄存器和(页面大小-1));
pPWR=(无符号长*)(pTemp+reg_地址);
printf(“应用程序中映射的GSM PWR PIN\n”);
}

我只能通过这段代码读取该pin码,现在我想将该pin码用作输出,并希望在3sec的时间间隔内进行上下转换。

最简单的方法是利用
sysfs
中的GPIO支持,在这里您可以控制所有导出的GPIO。请查看Linux,特别是用于Userspace pa的sysfs接口rt

sysfs
GPIO\u sysfs
)中启用GPIO支持后,GPIO控制将非常简单:

示例

GPIO=22

cd /sys/class/gpio
ls
echo $GPIO > /sys/class/gpio/export
ls
请注意,在第一个ls中,gpio22不存在,但在将gpio22导出到用户空间后确实存在

cd /sys/class/gpio/gpio$GPIO
ls
存在用于设置方向和检索当前值的文件

echo "in" > direction
cat value
您可以为输出配置GPIO并设置值

echo "out" > direction
echo 1 > value

示例取自。

我得到了,请查找以下代码,我得到了具体的pin地址,我访问了该pin,如

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;
}`

重复:我的答案很清楚,但是,您选择了不同的方法,错误的方法。这在用户空间中不起作用,因为您的流程有自己的寻址空间。我的答案非常清楚,可以涵盖您的特定问题。如果您有其他问题,但不包括原始问题,请创建一个单独的问题。否t以评论和/或问题的形式发布答案。