Handle GPIO in User Space ARM9 Embedded Linux AM1808

 ̄綄美尐妖づ 提交于 2019-12-12 14:20:45

问题


I have to interface my GSM module with the AM1808 based on ARM9.

I have assigned all the GPIO pins to the Da850.c as well as mux.h files. I successfully created a uImage and inserted that image in my flash.

I need to handle some of that GPIO from User application.

I know that we can handle the GPIO from the Kerel space but i need to handle from the user space.

As for example I have assigned a GPIO for power key to GSM module. I need to change the pin means (HIGH or LOW) through application.

Ok i have written a following code to access it from the User Space,

#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");
}

I can only read that pin through this code, Now i want to use that pin as an output and want to go high and low with the time interval of 3sec.


回答1:


The easiest way is to utilize GPIO support in sysfs, where you could control all the exported GPIO's. Please have a look at the Linux kernel GPIO documentation, in particular, Sysfs Interface for Userspace part.

After you have enabled GPIO support in sysfs (GPIO_SYSFS), the GPIO control would be as easy as:

Example

GPIO=22

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

Notice on the first ls that gpio22 doesn't exist, but does after you export GPIO 22 to user space.

cd /sys/class/gpio/gpio$GPIO
ls

There are files to set the direction and retrieve the current value.

echo "in" > direction
cat value

You can configure the GPIO for output and set the value as well.

echo "out" > direction
echo 1 > value

Example is taken from here.




回答2:


I got it please find following code for that,I got the Specific pin address and i have accessed that pin like,

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


来源:https://stackoverflow.com/questions/15642429/handle-gpio-in-user-space-arm9-embedded-linux-am1808

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!