从 shell 中,我可以像这样激活系统上的 LED:
#echo 1 > /sys/class/leds/NAME:COLOR:LOCATION/brightness
我想从 C 程序中执行完全相同的操作,但我无法找到如何完成此操作的简单示例?
像打开文件一样打开sysfs节点,向其写入“1”,然后再次关闭。
例如:
#include <stdio.h>
#include <fcntl.h>
void enable_led() {
int fd;
char d = '1';
fd = open("sys/class/leds/NAME:COLOR:LOCATION/brightness", O_WRONLY);
write (fd, &d, 1);
close(fd);
}
类似这样的:
#include <stdio.h>
int main(int argc, char **argv)
{
FILE* f = fopen("/sys/class/leds/NAME:COLOR:LOCATION/brightness", "w");
if (f == NULL) {
fprintf(stderr, "Unable to open path for writing\n");
return 1;
}
fprintf(f, "1\n");
fclose(f);
return 0;
}
我没有启动到我的 Linux 分区,但我怀疑它是这样的:
int f = open("/sys/class/leds/NAME:COLOR:LOCATION/brightness",O_WRONLY);
if (f != -1)
{
write(f, "1", 1);
close(f);
}
我尝试使用 Beaglebone Black。采用两种方式(fcntl 与 stdio),但 fcntl 是在 GPIO 上切换任何内容的唯一方法。
工作代码
int main (void) {
int f = 0;
// Set direction out
f = open("/sys/class/gpio/gpio60/direction", O_RDWR);
write(f, "out", 3);
close(f);
// Writing on/off to LED
f = open("/sys/class/gpio/gpio60/value", O_WRONLY);
while (1) {
// LED ON
printf("LED ON\n");
write(f, "1", 1);
// Sleep for 1 sec
sleep(1);
// LED OFF
printf("LED OFF\n");
write(f, "0", 1);
// Again, sleep for 1 sec
sleep(1);
}
close(f);
return 0;
}
无法运行代码
int main (void) {
FILE* f = 0;
// Set direction out
f = fopen("/sys/class/gpio/gpio60/direction", "w");
fprintf(f, "out\n");
fclose(f);
// Writing on/off to LED
f = fopen("/sys/class/gpio/gpio60/value", "w");
while (1) {
// LED ON
printf("LED ON\n");
fprintf(f, "1\n");
// Sleep for 1 sec
sleep(1);
// LED OFF
printf("LED OFF\n");
fprintf(f, "0\n", 1);
// Again, sleep for 1 sec
sleep(1);
}
fclose(f);
return 0;
}
我不知道,如果我尝试使用 sysfs 文件进行“文件”操作,它们会变成 ASCII 文本..但典型的文本操作方法(fprintf、fopen 等)似乎不起作用。