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

Par*_*hah 3 embedded arm embedded-linux

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

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

我需要从User应用程序处理一些GPIO.

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

例如,我已经为GSM模块分配了GPIO电源键.我需要通过应用程序更改引脚装置(HIGH或LOW).

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

#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");
}
Run Code Online (Sandbox Code Playgroud)

我只能通过这段代码读取该引脚,现在我想将该引脚用作输出,并希望以3秒的时间间隔进行高低.

And*_*ovs 10

最简单的方法是利用GPIO支持sysfs,您可以在其中控制所有导出的GPIO.请查看Linux 内核GPIO文档,特别是Sysfs Interface for Userspace部分.

sysfs(GPIO_SYSFS)中启用GPIO支持后,GPIO控件将非常简单:

GPIO=22

cd /sys/class/gpio
ls
echo $GPIO > /sys/class/gpio/export
ls
Run Code Online (Sandbox Code Playgroud)

注意gpio22不存在的第一个,但是在将GPIO 22导出到用户空间之后.

cd /sys/class/gpio/gpio$GPIO
ls
Run Code Online (Sandbox Code Playgroud)

有文件可以设置方向并检索当前值.

echo "in" > direction
cat value
Run Code Online (Sandbox Code Playgroud)

您可以配置GPIO输出并设置值.

echo "out" > direction
echo 1 > value
Run Code Online (Sandbox Code Playgroud)

示例取自此处.