WhyCan Forum

人过留名,雁过留声,感谢各位朋友不离不弃地支持。 QQ: 516333132, 微信: whycan_cn (哇酷网/挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2018-11-11 10:56:08

605364021
会员
注册时间: 2018-10-23
累计积分: 251

v3s实现流水灯显示

请问一下,我想在v3s板子上实现流水灯显示,修改驱动能实现吗?

离线

#2 2018-11-11 10:58:44

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

https://blog.csdn.net/lu_embedded/article/details/53061901

Linux下用文件IO的方式操作GPIO(/sys/class/gpio)

离线

#3 2018-11-11 11:20:58

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

晕哥 说:

https://blog.csdn.net/lu_embedded/article/details/53061901

Linux下用文件IO的方式操作GPIO(/sys/class/gpio)

谢谢晕哥

离线

#4 2018-11-11 15:53:03

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

现在led灯常亮,我想实现led闪烁状态,是应该去改leds-gpio.c文件和相应的dts和dtsi文件来实现?

离线

#5 2018-11-11 16:25:52

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

605364021 说:

现在led灯常亮,我想实现led闪烁状态,是应该去改leds-gpio.c文件和相应的dts和dtsi文件来实现?

在用户层操作就可以了 五、文件读写例程

前提是先执行:

1、导出
# echo 44 > /sys/class/gpio/export

2、设置方向
# echo out > /sys/class/gpio/gpio44/direction

离线

#6 2018-11-11 16:34:58

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

用户层操作是指直接在开发板上操作?

离线

#7 2018-11-11 17:25:12

Quotation
会员
注册时间: 2018-10-04
累计积分: 118

Re: v3s实现流水灯显示

605364021 说:

用户层操作是指直接在开发板上操作?

是指在你自己的程序里就可以实现,不用改系统的东西。

离线

#8 2018-11-11 19:49:37

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

Quotation 说:
605364021 说:

用户层操作是指直接在开发板上操作?

是指在你自己的程序里就可以实现,不用改系统的东西。

对,用 shell 脚本都可以, 按上面的流程走一次.

离线

#9 2018-11-11 21:15:32

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

green_led {
			label = "licheepi:green:usr";
			gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; /* PG0 */
			default-state = "on";
		};

.dts文件中关于led灯的描述,其中gpios中的6是第6个gpio?那么0是指什么....

离线

#10 2018-11-11 21:50:08

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

怎么找到led对应的gpio引脚编号....

离线

#11 2018-11-11 22:07:00

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

605364021 说:

怎么找到led对应的gpio引脚编号....

算出来的,比如 

PB5 = 32*1 + 5
PC6= 32*2 + 6

离线

#12 2018-11-11 22:26:05

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

晕哥 说:

算出来的,比如 

PB5 = 32*1 + 5
PC6= 32*2 + 6

_20181111221927.png

gpios = <&pio 6 0 GPIO_ACTIVE_LOW>; * PG0 *

如果我没看错原理图的话,led应该用的PG0,那应该是32+0?但我给gpio32输值没反应...

离线

#13 2018-11-11 22:28:27

arphone
会员
注册时间: 2017-11-03
累计积分: 65

Re: v3s实现流水灯显示

605364021 说:
晕哥 说:

算出来的,比如 

PB5 = 32*1 + 5
PC6= 32*2 + 6

https://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?

离线

#14 2018-11-11 23:05:14

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

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,板子依旧会亮绿灯,这是为什么?

离线

#15 2018-11-12 09:31:54

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

晕哥 说:
605364021 说:

现在led灯常亮,我想实现led闪烁状态,是应该去改leds-gpio.c文件和相应的dts和dtsi文件来实现?

在用户层操作就可以了 五、文件读写例程

前提是先执行:

1、导出
# echo 44 > /sys/class/gpio/export

2、设置方向
# 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灯灭

离线

#16 2018-11-12 09:35:51

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

如果需要闪烁(blink), 参考这个: https://blog.csdn.net/jklinux/article/details/78645106

那么如果控制LED灯的闪烁呢?有两种方式:

1. 应用空间控制,通过操作led的亮和灭来模拟闪烁.
网上描述的大部分都是这种方式.这种方式的好处是简单,并且通过应用程序控制,比较好根据实际的应用逻辑进行操作.
但是如果用户的应用对时间要求很高,或在无法进行阻塞等待,那么这种方式就可能不能满足需求.这个时候推荐使用kernel进行闪烁控制.

2. kernel控制led的闪烁
这里只描述最简单的实现方式.
打开kernel的 CONFIG_LEDS_TRIGGERSCONFIG_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_off

echo 100 > /sys/class/led/green/delay_on
echo 100 > /sys/class/led/green/delay_off

离线

#17 2018-11-12 09:39:40

lilo
会员
注册时间: 2017-10-15
累计积分: 214

Re: v3s实现流水灯显示

605364021 说:
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 呢?

离线

#18 2018-11-12 22:18:40

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

通过应用层控制gpio引脚已经可以实现led灯的闪烁,如果我想把led闪烁功能做成一个新的驱动模块,大致流程能说一下吗?

离线

#19 2018-11-13 08:14:00

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

605364021 说:

通过应用层控制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)

建议用软定时器,方便简单一些,反正这个精度要求也不高。

离线

#20 2018-11-14 17:11:40

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

我想交叉编译一个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改了各种版本也不行,会是什么问题?

离线

#21 2018-11-14 22:40:13

605364021
会员
注册时间: 2018-10-23
累计积分: 251

Re: v3s实现流水灯显示

我想交叉编译一个可以在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写得有问题?

离线

#22 2018-11-14 23:18:38

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

错误信息贴上来看看

离线

#23 2019-12-02 20:36:02

aaayao
会员
注册时间: 2019-10-30
累计积分: 72

Re: v3s实现流水灯显示

晕哥 说:

不好意思,5楼这个回复不是 leds-gpio 驱动配套的应用程序

https://www.kernel.org/doc/Documentation/devicetree/bindings/leds/leds-gpio.txt

参考这个: https://blog.csdn.net/jklinux/article/details/78645106

晕哥,你好:
               按照这个方法,没有看到leds目录,会是那里出问题了呢?

离线

#24 2019-12-02 21:02:02

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 8,528

Re: v3s实现流水灯显示

检查驱动和设备树.

离线

页脚