请问一下,我想在v3s板子上实现流水灯显示,修改驱动能实现吗?
离线
https://blog.csdn.net/lu_embedded/article/details/53061901
Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
谢谢晕哥
离线
现在led灯常亮,我想实现led闪烁状态,是应该去改leds-gpio.c文件和相应的dts和dtsi文件来实现?
离线
离线
用户层操作是指直接在开发板上操作?
离线
用户层操作是指直接在开发板上操作?
是指在你自己的程序里就可以实现,不用改系统的东西。
离线
green_led {
label = "licheepi:green:usr";
gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; /* PG0 */
default-state = "on";
};
.dts文件中关于led灯的描述,其中gpios中的6是第6个gpio?那么0是指什么....
离线
怎么找到led对应的gpio引脚编号....
离线
算出来的,比如
PB5 = 32*1 + 5
PC6= 32*2 + 6
gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; * PG0 *
如果我没看错原理图的话,led应该用的PG0,那应该是32+0?但我给gpio32输值没反应...
离线
晕哥 说:算出来的,比如
PB5 = 32*1 + 5
PC6= 32*2 + 6https://whycan.cn/files/members/1205/_20181111221927.png
gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; * PG0 *
如果我没看错原理图的话,led应该用的PG0,那应该是32+0?但我给gpio32输值没反应...
怎么会是32+ 0呢,不是应该32*6 + 0?
离线
leds {
compatible = "gpio-leds";
blue_led {
label = "licheepi:blue:usr";
gpios = <&pio 6 1 GPIO_ACTIVE_LOW>; /* PG1 */
};
green_led {
label = "licheepi:green:usr";
gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; /* PG0 */
default-state = "on"; //default状态表示设备处于active时的状态
};
red_led {
label = "licheepi:red:usr";
gpios = <&pio 6 2 GPIO_ACTIVE_LOW>; /* PG2 */
};
};
谢谢解答,我还有个不懂的地方,我把default-state = “on” 放到blue_led节点上,重新生成dtb文件,但是板子上电还是亮的绿灯,我去掉defalut-state,板子依旧会亮绿灯,这是为什么?
离线
605364021 说:现在led灯常亮,我想实现led闪烁状态,是应该去改leds-gpio.c文件和相应的dts和dtsi文件来实现?
在用户层操作就可以了 五、文件读写例程
前提是先执行:
1、导出
# echo 44 > /sys/class/gpio/export2、设置方向
# echo out > /sys/class/gpio/gpio44/direction
不好意思,5楼这个回复不是 leds-gpio 驱动配套的应用程序
https://www.kernel.org/doc/Documentation/devicetree/bindings/leds/leds-gpio.txt
参考这个: https://blog.csdn.net/jklinux/article/details/78645106
重编设备树并更新后启动系统, 然后就可以查看到myleds设备节点产生platform_device信息:
^_^ / # ls /sys/bus/platform/devices/myleds/
driver/ leds/ of_node/ subsystem/
driver_override modalias power/ uevent//看到有driver目录即表示已与platform_driver匹配上了.
^_^ / # ls /sys/bus/platform/devices/myleds/leds/led
led0/ led1/
//表示在led子系统里会创建出/sys/class/leds/led0 /sys/class/leds/led1目录控制led:
echo 1 > /sys/class/leds/led0/brightness // label为led0的led灯亮
echo 0 > /sys/class/leds/led0/brightness // label为led0的led灯灭
离线
如果需要闪烁(blink), 参考这个: https://blog.csdn.net/jklinux/article/details/78645106
那么如果控制LED灯的闪烁呢?有两种方式:
1. 应用空间控制,通过操作led的亮和灭来模拟闪烁.
网上描述的大部分都是这种方式.这种方式的好处是简单,并且通过应用程序控制,比较好根据实际的应用逻辑进行操作.
但是如果用户的应用对时间要求很高,或在无法进行阻塞等待,那么这种方式就可能不能满足需求.这个时候推荐使用kernel进行闪烁控制.2. kernel控制led的闪烁
这里只描述最简单的实现方式.
打开kernel的 CONFIG_LEDS_TRIGGERS 和 CONFIG_LEDS_TRIGGER_TIMER
已led名字为green 为例:#cat /sys/class/led/green/trigger
[none] nand-disk mmc0 timer输出类似上面的trigger条件,默认的是不闪烁,就是none
echo timer > /sys/class/led/green/trigger
这样 green 这个led灯就开始闪烁,默认是亮500ms,灭500ms. 如果想修改闪烁频率,
可以直接修改 /sys/class/led/green/delay_on 和 /sys/class/led/green/delay_offecho 100 > /sys/class/led/green/delay_on
echo 100 > /sys/class/led/green/delay_off
离线
leds { compatible = "gpio-leds"; blue_led { label = "licheepi:blue:usr"; gpios = <&pio 6 1 GPIO_ACTIVE_LOW>; /* PG1 */ }; green_led { label = "licheepi:green:usr"; gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; /* PG0 */ default-state = "on"; //default状态表示设备处于active时的状态 }; red_led { label = "licheepi:red:usr"; gpios = <&pio 6 2 GPIO_ACTIVE_LOW>; /* PG2 */ }; };
谢谢解答,我还有个不懂的地方,我把default-state = “on” 放到blue_led节点上,重新生成dtb文件,但是板子上电还是亮的绿灯,我去掉defalut-state,板子依旧会亮绿灯,这是为什么?
改成 off 呢?
离线
通过应用层控制gpio引脚已经可以实现led灯的闪烁,如果我想把led闪烁功能做成一个新的驱动模块,大致流程能说一下吗?
离线
通过应用层控制gpio引脚已经可以实现led灯的闪烁,如果我想把led闪烁功能做成一个新的驱动模块,大致流程能说一下吗?
1. 通过软定时器控制 gpio 实现: https://stackoverflow.com/questions/10812858/how-to-use-timers-in-linux-kernel-device-drivers
2. 通过硬定时器控制 gpio 实现: https://whycan.cn/t_1261.html (这是一个GPIO中断demo)
建议用软定时器,方便简单一些,反正这个精度要求也不高。
离线
我想交叉编译一个helloworld.ko模块至v3s板子,我的Makefile是这样写
CROSS_COMPLE:=arm-linux-gnueabihf-
ARCH:=arm
CC:=$(CROSS_COMPILE)gcc
LD:=$(CROSS_COMPILE)ld
obj-m := helloworld.o
KDIR := /home/zhang/linux //内核所在目录
PWD := $(shell pwd)
defaule:
make -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) modules clean
编译命令是make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
但是一编译出来,各种提示头文件错误。我按照别人Makefile改了各种版本也不行,会是什么问题?
离线
我想交叉编译一个可以在v3s开发板上运行hello.ko内核模块,下面分别是我的.C文件和Makefile文件
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void)
{
printk(KERN_INFO "Hello world enter\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Hello world exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_DESCRIPTION("A simple hello worild Module");
MODULE_ALIAS("a simplest module");
KERNELDIR:=/home/zhang/linux
obj-m += hello.o
default:
$(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules clean
我用的编译命令是make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
我进行编译是出现的大量的warning和error,能帮忙看下代码,是不是Makefile写得有问题?
离线
不好意思,5楼这个回复不是 leds-gpio 驱动配套的应用程序
https://www.kernel.org/doc/Documentation/devicetree/bindings/leds/leds-gpio.txt
参考这个: https://blog.csdn.net/jklinux/article/details/78645106
晕哥,你好:
按照这个方法,没有看到leds目录,会是那里出问题了呢?
离线
检查驱动和设备树.
主线linux电亮绿色led使用的什么方式呀,配置文件在哪里?
离线
晕哥
这楼代码一样 在MAKE 时 出现这个错误
jonsen@ubuntu:~/f1c100s/Linux_Drivers/chrdevbase$ make
make -C /home/jonsen/f1c100s/linux M=/home/jonsen/f1c100s/Linux_Drivers/chrdevbase modules
make[1]: Entering directory '/home/jonsen/f1c100s/linux'
make[2]: *** No rule to make target '/home/jonsen/f1c100s/Linux_Drivers/chrdevbase/hello.c', needed by '/home/jonsen/f1c100s/Linux_Drivers/chrdevbase/hello.o'. Stop.
make[1]: *** [Makefile:1508: _module_/home/jonsen/f1c100s/Linux_Drivers/chrdevbase] Error 2
make[1]: Leaving directory '/home/jonsen/f1c100s/linux'
make: *** [Makefile:20: default] Error 2
我想交叉编译一个可以在v3s开发板上运行hello.ko内核模块,下面分别是我的.C文件和Makefile文件
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> static int hello_init(void) { printk(KERN_INFO "Hello world enter\n"); return 0; } static void hello_exit(void) { printk(KERN_INFO "Hello world exit\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("Dual BSD/GPL"); MODULE_DESCRIPTION("A simple hello worild Module"); MODULE_ALIAS("a simplest module");
KERNELDIR:=/home/zhang/linux obj-m += hello.o default: $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules clean: $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules clean
我用的编译命令是make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
我进行编译是出现的大量的warning和error,能帮忙看下代码,是不是Makefile写得有问题?
离线