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 秒の時間間隔でハイとローになりたいと考えています。