Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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 在openWRT上运行GPIO映射_C_Linux_Embedded_Openwrt - Fatal编程技术网

C 在openWRT上运行GPIO映射

C 在openWRT上运行GPIO映射,c,linux,embedded,openwrt,C,Linux,Embedded,Openwrt,我在运行程序以控制Openwrt系统上的GPIO端口时遇到问题。作为一种设备,我使用ralink mt7628 我试图编译代码,但在运行编译后的程序时遇到了问题。我收到错误“无法打开mmap文件” 我认为“/dev/mem”有问题,但我不知道我能做什么 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <unistd.

我在运行程序以控制Openwrt系统上的GPIO端口时遇到问题。作为一种设备,我使用ralink mt7628

我试图编译代码,但在运行编译后的程序时遇到了问题。我收到错误“无法打开mmap文件”

我认为“/dev/mem”有问题,但我不知道我能做什么

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


#define MMAP_PATH   "/dev/mem"


#define RALINK_GPIO_DIR_IN      0
#define RALINK_GPIO_DIR_OUT     1

#define RALINK_REG_PIOINT       0x690
#define RALINK_REG_PIOEDGE      0x6A0
#define RALINK_REG_PIORENA      0x650
#define RALINK_REG_PIOFENA      0x660
#define RALINK_REG_PIODATA      0x620
#define RALINK_REG_PIODIR       0x600
#define RALINK_REG_PIOSET       0x630
#define RALINK_REG_PIORESET     0x640

#define RALINK_REG_PIO6332INT       0x694
#define RALINK_REG_PIO6332EDGE      0x6A4
#define RALINK_REG_PIO6332RENA      0x654
#define RALINK_REG_PIO6332FENA      0x664
#define RALINK_REG_PIO6332DATA      0x624
#define RALINK_REG_PIO6332DIR       0x604
#define RALINK_REG_PIO6332SET       0x634
#define RALINK_REG_PIO6332RESET     0x644

#define RALINK_REG_PIO9564INT       0x698
#define RALINK_REG_PIO9564EDGE      0x6A8
#define RALINK_REG_PIO9564RENA      0x658
#define RALINK_REG_PIO9564FENA      0x668
#define RALINK_REG_PIO9564DATA      0x628
#define RALINK_REG_PIO9564DIR       0x608
#define RALINK_REG_PIO9564SET       0x638
#define RALINK_REG_PIO9564RESET     0x648


static uint8_t* gpio_mmap_reg = NULL;
static int gpio_mmap_fd = 0;

static int gpio_mmap(void)
{
    if ((gpio_mmap_fd = open(MMAP_PATH, O_RDWR)) < 0) {
        fprintf(stderr, "unable to open mmap file");
        return -1;
    }

    gpio_mmap_reg = (uint8_t*) mmap(NULL, 1024, PROT_READ | PROT_WRITE,
        MAP_FILE | MAP_SHARED, gpio_mmap_fd, 0x10000000);
    if (gpio_mmap_reg == MAP_FAILED) {
        perror("foo");
        fprintf(stderr, "failed to mmap");
        gpio_mmap_reg = NULL;
        close(gpio_mmap_fd);
        return -1;
    }

    return 0;
}

int mt76x8_gpio_get_pin(int pin)
{
    uint32_t tmp = 0;

    /* MT7621, MT7628 */
    if (pin <= 31) {
        tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIODATA);
        tmp = (tmp >> pin) & 1u;
    } else if (pin <= 63) {
        tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332DATA);
        tmp = (tmp >> (pin-32)) & 1u;
    } else if (pin <= 95) {
        tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564DATA);
        tmp = (tmp >> (pin-64)) & 1u;
        tmp = (tmp >> (pin-24)) & 1u;
    }
    return tmp;

}

void mt76x8_gpio_set_pin_direction(int pin, int is_output)
{
    uint32_t tmp;

    /* MT7621, MT7628 */
    if (pin <= 31) {
        tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIODIR);
        if (is_output)
            tmp |=  (1u << pin);
        else
            tmp &= ~(1u << pin);
        *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIODIR) = tmp;
    } else if (pin <= 63) {
        tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332DIR);
        if (is_output)
            tmp |=  (1u << (pin-32));
        else
            tmp &= ~(1u << (pin-32));
        *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332DIR) = tmp;
    } else if (pin <= 95) {
        tmp = *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564DIR);
        if (is_output)
            tmp |=  (1u << (pin-64));
        else
            tmp &= ~(1u << (pin-64));
        *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564DIR) = tmp;
    }
}

void mt76x8_gpio_set_pin_value(int pin, int value)
{
    uint32_t tmp;

    /* MT7621, MT7628 */
    if (pin <= 31) {
        tmp = (1u << pin);
        if (value)
            *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIOSET) = tmp;
        else
            *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIORESET) = tmp;
    } else if (pin <= 63) {
        tmp = (1u << (pin-32));
        if (value)
            *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332SET) = tmp;
        else
            *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO6332RESET) = tmp;
    } else if (pin <= 95) {
        tmp = (1u << (pin-64));
        if (value)
            *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564SET) = tmp;
        else
            *(volatile uint32_t *)(gpio_mmap_reg + RALINK_REG_PIO9564RESET) = tmp;
    }
}

int main(int argc, char **argv)
{
    int ret = -1;

    if (gpio_mmap())
        return -1;

    printf("get pin 39 input %d\n", mt76x8_gpio_get_pin(39));
    printf("get pin 40 input %d\n", mt76x8_gpio_get_pin(40));
    printf("get pin 41 input %d\n", mt76x8_gpio_get_pin(41));
    printf("get pin 42 input %d\n", mt76x8_gpio_get_pin(42));


    printf("set pin 39 output 1\n");
    mt76x8_gpio_set_pin_direction(39, 1);
    mt76x8_gpio_set_pin_value(39, 1);
    printf("set pin 40 output 0\n");
    mt76x8_gpio_set_pin_direction(40, 1);
    mt76x8_gpio_set_pin_value(40, 0);
    printf("set pin 41 output 1\n");
    mt76x8_gpio_set_pin_direction(41, 1);
    mt76x8_gpio_set_pin_value(41, 1);
    printf("set pin 42 output 0\n");
    mt76x8_gpio_set_pin_direction(44, 1);
    mt76x8_gpio_set_pin_value(44, 0);

    while (1)
    {
        mt76x8_gpio_set_pin_value(44, 0);
        mt76x8_gpio_set_pin_value(44, 1);
    }
    close(gpio_mmap_fd);

    return ret;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义MMAP_路径“/dev/mem”
#在0中定义RALINK\u GPIO\u DIR\u
#定义RALINK\u GPIO\u DIR\u OUT 1
#定义RALINK_REG_点0x690
#定义RALINK_REG_PIOEDGE 0x6A0
#定义RALINK_REG_PIORENA 0x650
#定义RALINK_REG_PIOFENA 0x660
#定义rLink_REG_PIODATA 0x620
#定义RALINK_REG_PIODIR 0x600
#定义RALINK_REG_PIOSET 0x630
#定义RALINK_REG_PIORESET 0x640
#定义RALINK_REG_PIO6332INT 0x694
#定义RALINK_REG_PIO6332边缘0x6A4
#定义RALINK_REG_PIO6332RENA 0x654
#定义RALINK_REG_PIO6332FENA 0x664
#定义RALINK_REG_PIO6332数据0x624
#定义RALINK_REG_PIO6332DIR 0x604
#定义RALINK_REG_PIO6332集0x634
#定义RALINK_REG_PIO6332重置0x644
#定义RALINK_REG_PIO9564INT 0x698
#定义RALINK_REG_PIO9564边缘0x6A8
#定义RAINK_REG_PIO9564RENA 0x658
#定义RALINK_REG_PIO9564FENA 0x668
#定义RALINK_REG_PIO9564数据0x628
#定义RALINK_REG_PIO9564DIR 0x608
#定义RALINK_REG_PIO9564集0x638
#定义RALINK_REG_PIO9564重置0x648
静态uint8_t*gpio_mmap_reg=NULL;
静态int gpio_mmap_fd=0;
静态int gpio_mmap(无效)
{
如果((gpio_mmap_fd=open(mmap_路径,O_RDWR))<0){
fprintf(stderr,“无法打开mmap文件”);
返回-1;
}
gpio_mmap_reg=(uint8_t*)mmap(NULL,1024,PROT_READ,PROT_WRITE,
MAP|u文件| MAP|u共享,gpio_mmap_fd,0x10000000);
如果(gpio_mmap_reg==映射失败){
佩罗(“富”);
fprintf(标准,“未能进行mmap”);
gpio_mmap_reg=NULL;
关闭(gpio_mmap_fd);
返回-1;
}
返回0;
}
int mt76x8_gpio_get_引脚(int引脚)
{
uint32_t tmp=0;
/*MT7621,MT7628*/
如果(引脚>引脚)&1u;
}否则,如果(引脚>(引脚32))&1u;
}否则,如果(引脚>(引脚64))&1u;
tmp=(tmp>>(引脚24))&1u;
}
返回tmp;
}
无效mt76x8_gpio_设置_引脚_方向(int引脚,int为输出)
{
uint32_t tmp;
/*MT7621,MT7628*/

如果(pin检查
errno
,它将告诉您为什么无法打开它。我打赌是权限。@EugeneSh。“无法打开mmap文件,没有这样的设备或地址”嗯..你可以用
ls/dev
检查是否有这样的设备。@EugeneSh.ehh否…列表:然后你可能想去检查
errno
,它会告诉你为什么不能打开它。我打赌是权限。@EugeneSh。“无法打开mmap文件没有这样的设备或地址”嗯..你可以用
ls/dev
检查是否有这样的设备。@EugeneSh.ehh否..列表:那么你可能想去