3

GSM モジュールを ARM9 ベースの AM1808 と接続する必要があります。

すべての GPIO ピンを Da850.c と mux.h ファイルに割り当てました。uImage を正常に作成し、そのイメージをフラッシュに挿入しました。

その GPIO の一部をユーザー アプリケーションから処理する必要があります。

Kerel 空間から GPIO を処理できることはわかっていますが、ユーザー空間から処理する必要があります。

たとえば、電源キーの GPIO を GSM モジュールに割り当てました。アプリケーションでピン手段 (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");
}

このコードでのみそのピンを読み取ることができます。今、そのピンを出力として使用し、3 秒の時間間隔でハイとローになりたいと考えています。

4

2 に答える 2

10

sysfs最も簡単な方法は、エクスポートされたすべての GPIO を制御できる でGPIO サポートを利用することです。Linuxカーネル GPIO のドキュメント、特にSysfs Interface for Userspace部分を参照してください。

sysfs( ) でGPIO サポートを有効GPIO_SYSFSにすると、GPIO 制御は次のように簡単になります。

GPIO=22

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

最初の ls で、gpio22 が存在しないことに注意してください。ただし、GPIO 22 をユーザー空間にエクスポートした後に存在します。

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

方向を設定し、現在の値を取得するためのファイルがあります。

echo "in" > direction
cat value

出力用に GPIO を構成し、値を設定することもできます。

echo "out" > direction
echo 1 > value

例はここから取られます。

于 2013-03-26T10:37:38.313 に答える
0

そのための次のコードを見つけてください。特定のピンアドレスを取得し、そのピンに次のようにアクセスしました。

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;
}`
于 2013-07-19T07:54:02.607 に答える