瑞芯微RK3588 点灯之旅

点灯过程

  1. 设备上电,连接串口(232),在电脑上打上瑞芯微提供的驱动

  2. 使用shell进入系统(debian)

  3. 计算GPIO引脚,有 5 组 GPIO bank:GPIO0GPIO4,每组又以 A0A7,B0B7, C0C7, D0~D7 作为编号区分,常用以下公式计算引脚:

    GPIO pin脚计算公式:pin = bank * 32 + number

    GPIO 小组编号计算公式:number = group * 8 + X

  4. 进入/sys/class/gpio文件夹下,使用命令echo 130 > /sys/class/gpio/export将引脚写入,使用echo 1 > value拉高

  5. 点灯成功

继续点灯

  1. 以上是使用sys方法控制LED灯的。还可以使用libgpiod库来控制LED灯的GPIO。代码如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include <gpiod.h> //gpiod 头文件支持

struct gpiod_chip *chip;
struct gpiod_line *line_led;

struct gpiod_line_request_config config;

/*初始化led的line*/
int led_init(unsigned char gpio_chip_num, unsigned char gpio_off_num)
{
int ret;
char dev_name[16];

if(gpio_chip_num > 6 || gpio_off_num > 32)
{
printf("[INFO] %s argument error.\n", __FUNCTION__);
return -1;
}

memset(dev_name, 0, sizeof(dev_name));
snprintf(dev_name, sizeof(dev_name), "/dev/gpiochip%d", gpio_chip_num);

chip = gpiod_chip_open(dev_name);//打开chip
if(!chip)
{
printf("fail to open chip0\n");
return -1;
}

line_led = gpiod_chip_get_line(chip, gpio_off_num);//获取line
if(!line_led)
{
printf("fail to get line_led\n");
return -1;
}

config.consumer = "led_out";
config.request_type = GPIOD_LINE_REQUEST_DIRECTION_AS_IS;//设置请求方式为请求line,但是不改变current direction,很重要,使用reques_output函数会在每次初始化的时候将电平值设置为default_value
config.flags = 0;

ret = gpiod_line_request(line_led, &config, 0);
if(ret < 0)
{
printf("fail to request line_led for output mode\n");
return -1;
}

return ret;
}

int led_control(int cmd)
{
int ret;

if(cmd == 0)
{
ret = gpiod_line_set_value(line_led, 0);//拉低电平,控制led灯亮灭
}
else
{
ret = gpiod_line_set_value(line_led, 1);
}

if(ret < 0)
{
printf("fail to set line_led value\n");
return -1;
}

return ret;
}

int led_release(void)
{
gpiod_line_release(line_led);//释放line
gpiod_chip_close(chip);//关闭chip访问
}

int main(int argc, char *argv[])
{
if(0 > led_init(4, 2))
{
printf("led init error.\n");
return -1;
}


printf("led value: %d\n", gpiod_line_get_value(line_led));

led_release();

return 0;
}

  1. 代码编译问题

    在rk3588平台上直接使用gcc编译器编译,命令gcc -o gpiod_led_test led_gpiod_test.c -lgpiod,一定添加-lgpiod参数,连接libgpiod库。