Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用mmap/dev/mem方法的ARM linux用户空间gpio操作(能够写入gpio寄存器,但无法读取)_C_Linux_Arm_Mmap_Gpio - Fatal编程技术网

C 使用mmap/dev/mem方法的ARM linux用户空间gpio操作(能够写入gpio寄存器,但无法读取)

C 使用mmap/dev/mem方法的ARM linux用户空间gpio操作(能够写入gpio寄存器,但无法读取),c,linux,arm,mmap,gpio,C,Linux,Arm,Mmap,Gpio,PHYTEC提供的内核版本3.12.30-AM335x-PD15.1.1 如果我使用/sys/class/gpio方式,我可以看到按钮输入引脚(AM3359的gpio103)值从0变为1 在本次演习结束后 并执行以下命令,以使用/dev/mem方法读取gpio引脚: `devmem2 0x481ae13c` (第3列gpio的基数为0x481ae000+0x13c数据输出偏移量) 无论按钮位置如何,我都会得到下面的输出 /dev/mem opened Memory mapped at add

PHYTEC提供的内核版本3.12.30-AM335x-PD15.1.1

如果我使用/sys/class/gpio方式,我可以看到按钮输入引脚(AM3359的gpio103)值从0变为1

在本次演习结束后 并执行以下命令,以使用/dev/mem方法读取gpio引脚:

`devmem2 0x481ae13c` 
(第3列gpio的基数为0x481ae000+0x13c数据输出偏移量)

无论按钮位置如何,我都会得到下面的输出

/dev/mem opened
Memory mapped at address 0xb6fd1000.
Read at address  0x481AE13C (0xb6fd113c): 0x00000000
还有下面给出的c程序,我使用/dev/mem切换了gpios;然而,我无法成功地阅读它们

在头文件中:

#define GPIO0_START_ADDRESS (0x44E07000)
#define GPIO1_START_ADDRESS (0x4804C000)
#define GPIO2_START_ADDRESS (0x481AC000)
#define GPIO3_START_ADDRESS (0x481AE000)

#define GPIO0_END_ADDRESS   (0x44e09000)
#define GPIO1_END_ADDRESS   (0x4804E000)
#define GPIO2_END_ADDRESS   (0x481AE000)
#define GPIO3_END_ADDRESS   (0x481B0000)

#define GPIO0_SIZE (GPIO0_END_ADDRESS - GPIO0_START_ADDRESS)
#define GPIO1_SIZE (GPIO1_END_ADDRESS - GPIO1_START_ADDRESS)
#define GPIO2_SIZE (GPIO2_END_ADDRESS - GPIO2_START_ADDRESS)
#define GPIO3_SIZE (GPIO3_END_ADDRESS - GPIO3_START_ADDRESS)

#define GPIO_SETDATAOUT (0x194)
#define GPIO_CLEARDATAOUT (0x190)
#define GPIO_DATAOUT (0x13c)
在程序中的某个地方:

    int fd = open("/dev/mem", O_RDWR);
    //int fd = open("/dev/mem", O_RDWR|O_SYNC);

    gpio0_address = mmap(0, GPIO0_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO0_START_ADDRESS);
    gpio1_address = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDRESS);
    gpio2_address = mmap(0, GPIO2_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO2_START_ADDRESS);
    gpio3_address = mmap(0, GPIO3_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO3_START_ADDRESS);

    if(gpio0_address == MAP_FAILED){ printf("unable to map GPIO0 bank.\n"); }
    if(gpio1_address == MAP_FAILED){ printf("unable to map GPIO1 bank.\n"); }
    if(gpio2_address == MAP_FAILED){ printf("unable to map GPIO2 bank.\n"); }
    if(gpio3_address == MAP_FAILED){ printf("unable to map GPIO3 bank.\n"); }


    gpio0_dataout_address = gpio0_address + GPIO_DATAOUT;

    gpio0_setdataout_address = gpio0_address + GPIO_SETDATAOUT;

    gpio0_cleardataout_address = gpio0_address + GPIO_CLEARDATAOUT;

    gpio1_dataout_address = gpio1_address + GPIO_DATAOUT;

    gpio1_setdataout_address = gpio1_address + GPIO_SETDATAOUT;

    gpio1_cleardataout_address = gpio1_address + GPIO_CLEARDATAOUT;

    gpio2_dataout_address = gpio2_address + GPIO_DATAOUT;

    gpio2_setdataout_address = gpio2_address + GPIO_SETDATAOUT;

    gpio2_cleardataout_address = gpio2_address + GPIO_CLEARDATAOUT;

    gpio3_dataout_address = gpio3_address + GPIO_DATAOUT;

    gpio3_setdataout_address = gpio3_address + GPIO_SETDATAOUT;

    gpio3_cleardataout_address = gpio3_address + GPIO_CLEARDATAOUT;
    read_GPIO_bank_memory(3, &GPIO3_bank_memory);
读取功能:

   void read_GPIO_bank_memory(int bank, four_bytes* gpio_bank_dataout)
    {
        switch(bank)
        {
            case 0:

                gpio_bank_dataout->ALL = *gpio0_dataout_address;
                break;
            case 1:

                gpio_bank_dataout->ALL = *gpio1_dataout_address;

                break;
            case 2:

                gpio_bank_dataout->ALL = *gpio2_dataout_address;

                break;
            case 3:

                gpio_bank_dataout->ALL = *gpio3_dataout_address;

                break;
        }
    }

您应该使用GPIO_数据输入寄存器(偏移量=138h)从GPIO引脚读取数据,而不是GPIO_数据输出。

毫不奇怪,数据输出寄存器用于输出。如果要读取输入值,请使用数据输入寄存器。名字里有个线索…谢谢你指出,我知道这一定是很愚蠢的事情,但我迷路了。