内存通过beaglebone black中的gpio映射

时间:2016-05-12 04:14:27

标签: android c android-ndk beagleboneblack beagleboard

我们正在使用beaglebone black来获取数据。 Temprature sensor dht11取自beagle bone black的GPIO。

正常开启和关闭(单向传输)很容易完成但是当涉及到连续数据传输时,我们在android中获得了内存映射问题。

以下是声明部分。

typedef struct {
unsigned int id; /**< FS: ID is the file for the pin */
unsigned char bank; /**< MMAP: GPIO bank determines register */
unsigned int mask; /**< MMAP: Mask determines bit in register */
} GPIOBit_t;
static const uint32_t gpioAddrs[] = { 0x44E07000, 0x4804C000, 0x481AC000,0x481AE000 }; /**< Register Bank addresses */
static uint32_t *mapGPIO[4]; /**< Variable for GPIO memory map */
#define GPIO_OE_REG           0x134     /**< GPIO OE register address */

以下是生成问题的功能。

static void writeGPIOMmapdir(const GPIOBit_t *pinGPIO, const unsigned int value) {

fdGPIO = open("/dev/mem", O_RDWR);
/* mmap() the four GPIO bank registers */
int j;
for (j = 0; j < 4; j++) {

    mapGPIO[j] = (uint32_t *) mmap(NULL, getpagesize(),PROT_READ | PROT_WRITE, MAP_SHARED, fdGPIO, gpioAddrs[j]);

    unsigned int reg;
    reg = mapGPIO[1][GPIO_OE_REG / 4];
    if (value) {
        reg = reg | pinGPIO->mask;

        /* Set the appropriate OE register */
        //*****************ISSUE IS IN BELOW LINE*******************
        mapGPIO[pinGPIO->bank][GPIO_OE_REG / 4] = reg;
    } else {
        reg = reg & (0xFFFFFFFF - pinGPIO->mask);
        mapGPIO[pinGPIO->bank][GPIO_OE_REG / 4] = reg;
    }
}

在logcat中获取内存映射问题。然后整个应用程序重新启动。

  

01-01 00:19:30.814:A / libc(965):致命信号11(SIGSEGV)位于0x00000134(代码= 1),线程983(线程-56)

如果有可能,任何人都可以帮助我。

谢谢:)

1 个答案:

答案 0 :(得分:1)

不应该这样:

reg = mapGPIO[1][GPIO_OE_REG / 4];

Be:

reg = mapGPIO[j][GPIO_OE_REG / 4];