|
最近在研究99pai控制S_LED灯的功能。在CSDN上检索到【驱动篇】龙芯LS2K0300之LED驱动文章,里面详细讲述了如何在99pai平台上如何控制LED灯,该文解决方案为增加一个控制S_LED的kernel model。我个人认为该方案有效,但兼容性差,如果根据99pai开发其他系统,需要进行编译性适配,后期工作量巨大。因此本人探索了基于kernel leds-gpio子系统的研究。
根据99pai硬件逻辑图所示,LS2K300的GPIO-PIN83引脚作为S_LED控制引脚,PIN83输出低电平时有效(低有效)。
本人使用的论坛提供的kernel 6.8-rc-12版本,其默认99pai配置没有加入LED_GPIO功能,编译时需要使能LEDS_GPIO。
关于设备树LED的配置:
根据loongson_ls2k0300.dtsi中关于pingctrl外设描述,在kernel下该芯片GPIO被分解为7个子控制器(gpa0-gpa7),每一个子控制器管理16个PIN。(个人研读了手册和pinctrl-loongson.c认为该设计是为了方便使用GPIO中断才这么设计。)
根据芯片用户手册3.5.2中断相关寄存器描述,根据上图可推PIN 83引脚在Kernel下映射为 gpa5-pin3。
修改设备树文件:
- soc {
- sound {
- status = "okay";
- compatible = "loongson,ls-sound";
- loongson,i2s-controller = <&i2s>;
- loongson,audio-codec = <&audio>;
- codec-names = "ES8323 PAIF RX","Playback", "ES8323 HiFi", "ES8323.0-0010",
- "ES8323 PAIF TX","Capture","ES8323 HiFi","ES8323.0-0010";
- };
- reserved-memory {
- #address-cells = <2>;
- #size-cells = <2>;
- ranges;
- display_reserved: framebuffer@30000000 {
- compatible = "shared-dma-pool";
- reg = <0x0 0xa0000000 0x0 0x08000000>; /* 128M */
- linux,cma-default;
- };
- };
- leds {
- compatible = "gpio-leds";
- led0 {
- gpios = <&gpa5 3 GPIO_ACTIVE_LOW>; /*ping 83*/
- default-state = "keep";
- };
- };
- };
复制代码 编译并嵌入设备树,验证:
- root@loongson-ls2k300-evb:~# cd /sys/class/leds/led0
- root@loongson-ls2k300-evb:/sys/class/leds/led0# ls -l
- total 0
- -rw-r--r-- 1 root root 16384 Jun 2 09:06 brightness
- lrwxrwxrwx 1 root root 0 Jun 2 09:08 device -> ../../../soc:leds
- -r--r--r-- 1 root root 16384 Jun 2 09:06 max_brightness
- drwxr-xr-x 2 root root 0 Jun 2 09:08 power
- lrwxrwxrwx 1 root root 0 Jun 2 09:06 subsystem -> ../../../../../../class/leds
- -rw-r--r-- 1 root root 0 Jun 2 09:06 trigger
- -rw-r--r-- 1 root root 16384 Jun 2 09:06 uevent
- root@loongson-ls2k300-evb:/sys/class/leds/led0# cat brightness
- 1
- root@loongson-ls2k300-evb:/sys/class/leds/led0# echo 0 > brightness
- root@loongson-ls2k300-evb:/sys/class/leds/led0# echo 1 > brightness
- root@loongson-ls2k300-evb:/sys/class/leds/led0#
复制代码 当输入0至brightness时,S_LED熄灭。当输入1至brightness时,S_LED点亮。
|
|