那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

linux--LED子系統(tǒng)一文讀懂

Rice嵌入式開(kāi)發(fā)技術(shù)分享 ? 來(lái)源:Rice嵌入式 ? 作者:Rice嵌入式 ? 2024-08-02 16:09 ? 次閱讀

Led子系統(tǒng)框架

52b284d8-4ed6-11ef-a4b4-92fbcf53809c.png

Linux內(nèi)核中,LED子系統(tǒng)扮演著控制LED燈的核心角色,它通過(guò)一套規(guī)范化的驅(qū)動(dòng)架構(gòu),簡(jiǎn)化了LED驅(qū)動(dòng)程序的開(kāi)發(fā)流程,讓開(kāi)發(fā)者能夠更專注于功能實(shí)現(xiàn)而非硬件層面的復(fù)雜性。
核心架構(gòu)

LED子系統(tǒng)基于一個(gè)統(tǒng)一的驅(qū)動(dòng)模型,這個(gè)模型定義了一系列標(biāo)準(zhǔn)的應(yīng)用程序接口(API),用以執(zhí)行LED的基本操作,如點(diǎn)亮、熄滅和調(diào)節(jié)閃爍頻率。此外,該模型還規(guī)定了設(shè)備樹(shù)節(jié)點(diǎn)的格式標(biāo)準(zhǔn),使得硬件信息的描述變得規(guī)范化和統(tǒng)一化。

驅(qū)動(dòng)類型

LED驅(qū)動(dòng)程序主要分為兩大類:

  • LED Class驅(qū)動(dòng):這是一種普適性的驅(qū)動(dòng)實(shí)現(xiàn),能夠跨多種硬件平臺(tái)工作,支持不同類型的LED。
  • Platform驅(qū)動(dòng):與特定硬件平臺(tái)緊密相關(guān),需要根據(jù)平臺(tái)特性定制開(kāi)發(fā)。
開(kāi)發(fā)過(guò)程

開(kāi)發(fā)者在編寫(xiě)LED驅(qū)動(dòng)時(shí),需要遵循LED子系統(tǒng)定義的接口規(guī)范,實(shí)現(xiàn)包括但不限于以下幾個(gè)關(guān)鍵函數(shù):

  • probe接口:初始化驅(qū)動(dòng),準(zhǔn)備硬件資源。
  • remove接口:卸載驅(qū)動(dòng),釋放資源。
  • set_brightness接口:調(diào)整LED的亮度。

同時(shí),硬件相關(guān)的信息,如GPIO配置和亮度調(diào)節(jié)范圍,需要在設(shè)備樹(shù)中明確描述,以便驅(qū)動(dòng)程序能夠正確地識(shí)別和使用這些硬件資源。

設(shè)備樹(shù)集成

設(shè)備樹(shù)的使用,為硬件描述提供了一種結(jié)構(gòu)化的方法,使得LED子系統(tǒng)的驅(qū)動(dòng)程序能夠更加靈活地適應(yīng)不同的硬件環(huán)境。

總結(jié)

LED子系統(tǒng)通過(guò)其標(biāo)準(zhǔn)化的驅(qū)動(dòng)框架,極大地降低了LED驅(qū)動(dòng)程序的開(kāi)發(fā)難度,讓開(kāi)發(fā)者可以更加便捷地實(shí)現(xiàn)LED控制功能,而無(wú)需深入了解底層硬件的具體實(shí)現(xiàn)。

Led子系統(tǒng)描述

Led子系統(tǒng)相關(guān)描述可在內(nèi)核源碼中的文檔中查看:Documentation/leds/leds-class.txt。

led 子系統(tǒng)是一個(gè)簡(jiǎn)單的 Linux 子系統(tǒng) ,在目錄 /sys/class/leds 下展示該子系統(tǒng)設(shè)備,每個(gè)設(shè)備都有自己的屬性:

52b9f114-4ed6-11ef-a4b4-92fbcf53809c.png

brightness:設(shè)置 LED 亮度,范圍0~max_brightness
max_brightness:最大亮度(255或其他數(shù)字)
trigger:觸發(fā)方式,如 heartbeat、mmc0、backlight、gpio
delay_off、delay_on:trigger為timer時(shí),LED亮滅的時(shí)間,單位ms

Led子系統(tǒng)頭文件:kernel/include/linux/leds.h

enumled_brightness{
LED_OFF=0,//全暗
LED_HALF=127,//一半亮度
LED_FULL=255,//最大亮度
};

Led子系統(tǒng)框架分析

Led子系統(tǒng)框架代碼分析

led-class.c
  • led-class.c:led子系統(tǒng)框架的入口
  • 維護(hù) LED 子系統(tǒng)的所有 LED 設(shè)備,為 LED 設(shè)備提供注冊(cè)操作函數(shù):
    • led_classdev_register()
    • devm_led_classdev_register()
  • 注銷操作函數(shù):
    • led_classdev_unregister()
    • devm_led_classdev_unregister()
  • 電源管理的休眠和恢復(fù)操作函數(shù):
    • led_classdev_suspend()
    • led_classdev_resume();
  • 用戶態(tài)操作接口:brightness 、max_brightness
led-core.c
  • 抽象出 LED 操作邏輯,封裝成函數(shù)導(dǎo)出,供其它文件使用:
    • 核心初始化:led_init_core()
    • 設(shè)置led閃爍時(shí)間:led_blink_set()
    • 閃爍一次:led_blink_set_oneshot()
    • led停止閃爍:led_stop_software_blink()
    • 設(shè)置led的亮度:led_set_brightness()
    • 更新亮度:led_update_brightness
    • 用戶態(tài)關(guān)閉:led_sysfs_disable
    • 用戶態(tài)打開(kāi):led_sysfs enable
    • leds鏈表:leds_list
    • leds鏈表鎖:leds_list_lock
led-triggers.c
  • 維護(hù) LED 子系統(tǒng)的所有觸發(fā)器,為觸發(fā)器提供注冊(cè)操作函數(shù):

    • led_trigger_register()
    • devm_led_trigger_register()
    • led_trigger_register_simple()
  • 注銷操作函數(shù):

    • led_trigger_unregister()
    • led_trigger_unregister_simple()
  • 以及其它觸發(fā)器相關(guān)的操作函數(shù)

ledtrig-timer.c、ledtrig-xxx.c
  • 以 leds-gpio.c 為例:
  1. 通過(guò)設(shè)備樹(shù)匹配到設(shè)備信息后,將調(diào)用 probe() 函數(shù),
  2. 根據(jù)設(shè)備信息設(shè)置led_classdev,
  3. 調(diào)用 devm_led_classdev_register() 注冊(cè) LED 設(shè)備。

Led子系統(tǒng)框架結(jié)構(gòu)體分析

結(jié)構(gòu)體:led_classdev
structled_classdev{
constchar*name;//名字
enumled_brightnessbrightness;//亮度
enumled_brightnessmax_brightness;//最大亮度
intflags;

/*Lower16bitsreflectstatus*/
#defineLED_SUSPENDED(1<
/*Upper16bitsreflectcontrolinformation*/
#defineLED_CORE_SUSPENDRESUME(1<
#defineLED_BLINK_ONESHOT(1<
#defineLED_BLINK_ONESHOT_STOP(1<
#defineLED_BLINK_INVERT(1<
#defineLED_SYSFS_DISABLE(1<
#defineSET_BRIGHTNESS_ASYNC(1<
#defineSET_BRIGHTNESS_SYNC(1<
#defineLED_DEV_CAP_FLASH(1<

//設(shè)置亮度API
void(*brightness_set)(structled_classdev*led_cdev,enumled_brightnessbrightness);
int(*brightness_set_sync)(structled_classdev*led_cdev,enumled_brightnessbrightness);

//獲取亮度API
enumled_brightness(*brightness_get)(structled_classdev*led_cdev);

//閃爍時(shí)點(diǎn)亮和熄滅的時(shí)間設(shè)置
int(*blink_set)(structled_classdev*led_cdev,unsignedlong*delay_on,unsignedlong*delay_off);

structdevice*dev;
conststructattribute_group**groups;

//leds-list的node
structlist_headnode;
//默認(rèn)trigger的名字
constchar*default_trigger;
//閃爍的開(kāi)關(guān)時(shí)間
unsignedlongblink_delay_on,blink_delay_off;
//閃爍的定時(shí)器鏈表
structtimer_listblink_timer;
//閃爍的亮度
intblink_brightness;
void(*flash_resume)(structled_classdev*led_cdev);

structwork_structset_brightness_work;
intdelayed_set_value;

#ifdefCONFIG_LEDS_TRIGGERS
//trigger的鎖
structrw_semaphoretrigger_lock;
//led的trigger
structled_trigger*trigger;
//trigger的鏈表
structlist_headtrig_list;
//trigger的數(shù)據(jù)
void*trigger_data;
boolactivated;
#endif
structmutexled_access;
};
結(jié)構(gòu)體:gpio_led
structgpio_led{
constchar*name;
constchar*default_trigger;
unsignedgpio;
unsignedactive_low:1;
unsignedretain_state_suspended:1;
unsignedpanic_indicator:1;
unsigneddefault_state:2;
/*default_stateshouldbeoneofLEDS_GPIO_DEFSTATE_(ON|OFF|KEEP)*/
structgpio_desc*gpiod;
};
  • 其中:
    • name: led名字
    • default_trigger: LED 燈在Linux 系統(tǒng)中的默認(rèn)功能,比如作為系統(tǒng)心跳指示燈等等。
    • default_state: 默認(rèn)狀態(tài),如:
#defineLEDS_GPIO_DEFSTATE_OFF0
#defineLEDS_GPIO_DEFSTATE_ON1
#defineLEDS_GPIO_DEFSTATE_KEEP2

Led子系統(tǒng)LED_GPIO

LED_GPIO驅(qū)動(dòng)使能
  • 在內(nèi)核源碼中進(jìn)入menuconfig
->DeviceDrivers
->LEDSupport(NEW_LEDS[=y])
->LEDSupportforGPIOconnectedLEDs

52bdba92-4ed6-11ef-a4b4-92fbcf53809c.png

可以看出,把Linux內(nèi)部自帶的LED燈驅(qū)動(dòng)編譯進(jìn)內(nèi)核以后,CONFIG_LEDS_GPIO就會(huì)等于‘y’:

52c6bc5a-4ed6-11ef-a4b4-92fbcf53809c.png

Linux自帶LED_GPIO驅(qū)動(dòng)

LED_GPIO燈驅(qū)動(dòng)文件為/drivers/leds/leds-gpio.c,可以通過(guò)makefile文件查看:/drivers/leds/Makefile:

52d0c95c-4ed6-11ef-a4b4-92fbcf53809c.png

  • leds-gpio.c驅(qū)動(dòng)文件:
staticconststructof_device_idof_gpio_leds_match[]={
{.compatible="gpio-leds",},
{},
};
......
staticstructplatform_drivergpio_led_driver={
.probe=gpio_led_probe,
.remove=gpio_led_remove,
.driver={
.name="leds-gpio",
.of_match_table=of_gpio_leds_match,
},
};

module_platform_driver(gpio_led_driver);
  • LED 驅(qū)動(dòng)的匹配表,此表只有一個(gè)匹配項(xiàng),compatible內(nèi)容為“gpio-leds”,因此設(shè)備樹(shù)中的 LED 燈設(shè)備節(jié)點(diǎn)的 compatible 屬性值也要為“gpio-leds”,否則設(shè)備和驅(qū)動(dòng)匹配不成功,驅(qū)動(dòng)就沒(méi)法工作。
gpio_led_probe 函數(shù)簡(jiǎn)析
staticintgpio_led_probe(structplatform_device*pdev)
{
structgpio_led_platform_data*pdata=dev_get_platdata(&pdev->dev);
structgpio_leds_priv*priv;
inti,ret=0;

if(pdata&&pdata->num_leds){
priv=devm_kzalloc(&pdev->dev,struct_size(priv,leds,pdata->num_leds),
GFP_KERNEL);
if(!priv)
return-ENOMEM;

priv->num_leds=pdata->num_leds;
for(i=0;inum_leds;i++){
conststructgpio_led*template=&pdata->leds[i];
structgpio_led_data*led_dat=&priv->leds[i];

if(template->gpiod)
led_dat->gpiod=template->gpiod;
else
led_dat->gpiod=
gpio_led_get_gpiod(&pdev->dev,
i,template);
if(IS_ERR(led_dat->gpiod)){
dev_info(&pdev->dev,"SkippingunavailableLEDgpio%d(%s)n",
template->gpio,template->name);
continue;
}

ret=create_gpio_led(template,led_dat,
&pdev->dev,NULL,
pdata->gpio_blink_set);
if(ret0)
returnret;
}
}else{
priv=gpio_leds_create(pdev);
if(IS_ERR(priv))
returnPTR_ERR(priv);
}

platform_set_drvdata(pdev,priv);

return0;
}
  • 進(jìn)入probe函數(shù),pdata此時(shí)為空,進(jìn)入gpio_leds_create:
staticstructgpio_leds_priv*gpio_leds_create(structplatform_device*pdev)
{
structdevice*dev=&pdev->dev;
structfwnode_handle*child;
structgpio_leds_priv*priv;
intcount,ret;

count=device_get_child_node_count(dev);
if(!count)
returnERR_PTR(-ENODEV);

priv=devm_kzalloc(dev,struct_size(priv,leds,count),GFP_KERNEL);
if(!priv)
returnERR_PTR(-ENOMEM);

device_for_each_child_node(dev,child){
structgpio_led_data*led_dat=&priv->leds[priv->num_leds];
structgpio_ledled={};
constchar*state=NULL;

/*
*AcquiregpiodfromDTwithuninitializedlabel,which
*willbeupdatedafterLEDclassdeviceisregistered,
*OnlythenthefinalLEDnameisknown.
*/
led.gpiod=devm_fwnode_get_gpiod_from_child(dev,NULL,child,
GPIOD_ASIS,
NULL);
if(IS_ERR(led.gpiod)){
fwnode_handle_put(child);
returnERR_CAST(led.gpiod);
}

led_dat->gpiod=led.gpiod;

if(!fwnode_property_read_string(child,"default-state",
&state)){
if(!strcmp(state,"keep"))
led.default_state=LEDS_GPIO_DEFSTATE_KEEP;
elseif(!strcmp(state,"on"))
led.default_state=LEDS_GPIO_DEFSTATE_ON;
else
led.default_state=LEDS_GPIO_DEFSTATE_OFF;
}

if(fwnode_property_present(child,"retain-state-suspended"))
led.retain_state_suspended=1;
if(fwnode_property_present(child,"retain-state-shutdown"))
led.retain_state_shutdown=1;
if(fwnode_property_present(child,"panic-indicator"))
led.panic_indicator=1;

ret=create_gpio_led(&led,led_dat,dev,child,NULL);
if(ret0){
fwnode_handle_put(child);
returnERR_PTR(ret);
}
/*SetgpiodlabeltomatchthecorrespondingLEDname.*/
gpiod_set_consumer_name(led_dat->gpiod,
led_dat->cdev.dev->kobj.name);
priv->num_leds++;
}

returnpriv;
}
  • 函數(shù)gpio_leds_create描述:
  1. 調(diào)用device_get_child_node_count函數(shù)統(tǒng)計(jì)子節(jié)點(diǎn)數(shù)量,一般在在設(shè)備樹(shù)中創(chuàng)建一個(gè)節(jié)點(diǎn)表示LED燈,然后在這個(gè)節(jié)點(diǎn)下面為每個(gè)LED燈創(chuàng)建一個(gè)子節(jié)點(diǎn)。因此子節(jié)點(diǎn)數(shù)量也是LED燈的數(shù)量。
  2. 遍歷每個(gè)子節(jié)點(diǎn),獲取每個(gè)子節(jié)點(diǎn)的信息:
  • devm_get_gpiod_from_child獲取每個(gè)gpio燈的gpio_desc信息。
  • 獲取label屬性,label作為led的名字
  • 獲取“l(fā)inux,default-trigger”屬性,可以通過(guò)此屬性設(shè)置某個(gè) LED 燈在Linux 系統(tǒng)中的默認(rèn)功能,比如作為系統(tǒng)心跳指示燈等等。
  • 獲取“default-state”屬性值,也就是 LED 燈的默認(rèn)狀態(tài)屬性
  • create_gpio_led 函數(shù)創(chuàng)建 LED 相關(guān)的 io,常用gpio操作
create_gpio_led 函數(shù)簡(jiǎn)析
staticintcreate_gpio_led(conststructgpio_led*template,
structgpio_led_data*led_dat,structdevice*parent,
structfwnode_handle*fwnode,gpio_blink_set_tblink_set)
{
structled_init_datainit_data={};
intret,state;

led_dat->cdev.default_trigger=template->default_trigger;
led_dat->can_sleep=gpiod_cansleep(led_dat->gpiod);
if(!led_dat->can_sleep)
led_dat->cdev.brightness_set=gpio_led_set;
else
led_dat->cdev.brightness_set_blocking=gpio_led_set_blocking;
led_dat->blinking=0;
if(blink_set){
led_dat->platform_gpio_blink_set=blink_set;
led_dat->cdev.blink_set=gpio_blink_set;
}
if(template->default_state==LEDS_GPIO_DEFSTATE_KEEP){
state=gpiod_get_value_cansleep(led_dat->gpiod);
if(state0)
returnstate;
}else{
state=(template->default_state==LEDS_GPIO_DEFSTATE_ON);
}
led_dat->cdev.brightness=state?LED_FULL:LED_OFF;
if(!template->retain_state_suspended)
led_dat->cdev.flags|=LED_CORE_SUSPENDRESUME;
if(template->panic_indicator)
led_dat->cdev.flags|=LED_PANIC_INDICATOR;
if(template->retain_state_shutdown)
led_dat->cdev.flags|=LED_RETAIN_AT_SHUTDOWN;

ret=gpiod_direction_output(led_dat->gpiod,state);
if(ret0)
returnret;

if(template->name){
led_dat->cdev.name=template->name;
ret=devm_led_classdev_register(parent,&led_dat->cdev);
}else{
init_data.fwnode=fwnode;
ret=devm_led_classdev_register_ext(parent,&led_dat->cdev,
&init_data);
}

returnret;
}
  • 函數(shù)create_gpio_led描述:
    • 先獲取gpiod信息
    • 配置led_dat屬性,包括default_state, brightness等信息
    • 配置gpio方向
    • 將led注冊(cè)給LED子系統(tǒng)
gpio_led_set函數(shù)簡(jiǎn)析
staticvoidgpio_led_set(structled_classdev*led_cdev,
enumled_brightnessvalue)
{
structgpio_led_data*led_dat=cdev_to_gpio_led_data(led_cdev);
intlevel;

if(value==LED_OFF)
level=0;
else
level=1;

if(led_dat->blinking){
led_dat->platform_gpio_blink_set(led_dat->gpiod,level,
NULL,NULL);
led_dat->blinking=0;
}else{
if(led_dat->can_sleep)
gpiod_set_value_cansleep(led_dat->gpiod,level);
else
gpiod_set_value(led_dat->gpiod,level);
}
}
  • 函數(shù)gpio_led_set描述:
    • 先獲取led_gpio信息
    • 獲取led 的brightness的value
    • 通過(guò)gpiod_set_value設(shè)置gpio的電平
以YY3568為例YY3568開(kāi)發(fā)板,板載兩顆藍(lán)色LED燈供用戶使用,我們將其命名為blue1blue2

52d8d8c2-4ed6-11ef-a4b4-92fbcf53809c.png

DTS編寫(xiě)

gpio_leds:gpio-leds{
compatible="gpio-leds";
led@1{
gpios=<&gpio3?RK_PA4?GPIO_ACTIVE_HIGH>;
label="blue1";//Blue1
retain-state-suspended;
};

led@2{
gpios=<&gpio2?RK_PB2?GPIO_ACTIVE_HIGH>;
label="blue2";//Blue2
retain-state-suspended;
};
};
  • 創(chuàng)建一個(gè)節(jié)點(diǎn)表示 LED 燈設(shè)備,比如gpio_leds,如果板子上有多個(gè) LED 燈的話每個(gè) LED燈都作為gpio_leds的子節(jié)點(diǎn)。
  • gpio_leds節(jié)點(diǎn)的 compatible 屬性值一定要為“gpio-leds”。
  • 設(shè)置 label 屬性,此屬性為可選,每個(gè)子節(jié)點(diǎn)都有一個(gè) label 屬性,label 屬性一般表示LED 燈的名字,比如以顏色區(qū)分的話就是 red、green 等等。
  • 每個(gè)子節(jié)點(diǎn)必須要設(shè)置 gpios 屬性值,表示此 LED 所使用的 GPIO 引腳!
  • 可以設(shè)置“l(fā)inux,default-trigger”屬性值,也就是設(shè)置 LED 燈的默認(rèn)功能,可以查閱Documentation/devicetree/bindings/leds/common.txt 這個(gè)文檔來(lái)查看可選功能,比
    • backlight:LED 燈作為背光。
    • default-on:LED 燈打開(kāi)
    • heartbeat:LED 燈作為心跳指示燈,可以作為系統(tǒng)運(yùn)行提示燈。
    • ide-disk:LED 燈作為硬盤(pán)活動(dòng)指示燈。
    • timer:LED 燈周期性閃爍,由定時(shí)器驅(qū)動(dòng),閃爍頻率可以修改
  • 可以設(shè)置“default-state”屬性值,可以設(shè)置為 on、off 或 keep,為 on 的時(shí)候 LED 燈默認(rèn)打開(kāi),為 off 的話 LED 燈默認(rèn)關(guān)閉,為 keep 的話 LED 燈保持當(dāng)前模式。

基于Sysfs操作Led-gpio

關(guān)于sysfs相關(guān)文章:linux--sysfs文件系統(tǒng)

  • 點(diǎn)亮LED-GPIO--輸入:echo 255 > /sys/class/leds/blue1/brightness

52e489ec-4ed6-11ef-a4b4-92fbcf53809c.png

52ee760a-4ed6-11ef-a4b4-92fbcf53809c.png

  • 關(guān)閉LED-GPIO--輸入:echo 0 > /sys/class/leds/blue1/brightness

52f5e37c-4ed6-11ef-a4b4-92fbcf53809c.png

52fbc468-4ed6-11ef-a4b4-92fbcf53809c.png

  • 閃爍LED-GPIO--輸入:
#echotimer>/sys/class/leds/blue1/trigger
#echo100>/sys/class/leds/blue1/delay_on
#echo200>/sys/class/leds/blue1/delay_off

5302ead6-4ed6-11ef-a4b4-92fbcf53809c.png


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23351

    瀏覽量

    663140
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210376
  • 子系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    12453
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux驅(qū)動(dòng)分析之input子系統(tǒng)

    Linux內(nèi)核為了能夠處理各種不同類型的輸入設(shè)備,比如: 觸摸屏 ,鼠標(biāo) , 鍵盤(pán) , 操縱桿等設(shè)備 ,設(shè)計(jì)并實(shí)現(xiàn)了Linux 輸入子系統(tǒng) ,它為驅(qū)動(dòng)和應(yīng)用提供了統(tǒng)一的接口函數(shù),方便實(shí)
    發(fā)表于 02-01 10:38 ?564次閱讀

    搞懂Linux pinctrl/gpio子系統(tǒng)

    注: 所有文章基于linux-3.13以上,本系列主要介紹 GPIO的些基本知識(shí),驅(qū)動(dòng)操作GPIO的接口,應(yīng)用層通過(guò)sysfs操作GPIO的接口,GPIO些debug信息查看,以及對(duì)高通相關(guān)
    發(fā)表于 06-09 09:52 ?2819次閱讀

    Linux LED子系統(tǒng)詳解

    Linux LED子系統(tǒng)詳解
    的頭像 發(fā)表于 06-10 10:37 ?1591次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>詳解

    讀懂接口模塊的組合應(yīng)用有哪些?

    讀懂接口模塊的組合應(yīng)用有哪些?
    發(fā)表于 05-17 07:15

    讀懂什么是NEC協(xié)議

    讀懂什么是NEC協(xié)議?
    發(fā)表于 10-15 09:22

    讀懂ARM微處理器指令系統(tǒng)

    叫你如何讀懂ARM微處理器指令系統(tǒng)
    發(fā)表于 03-26 14:30 ?53次下載

    Windows 子系統(tǒng)助力 Linux 2.0

    Windows 子系統(tǒng)助力 Linux 2.0
    的頭像 發(fā)表于 01-04 11:17 ?691次閱讀

    Linux系統(tǒng)中NFC子系統(tǒng)架構(gòu)分析

    目前在Linux系統(tǒng)中,每個(gè)廠家都使用不同的方式實(shí)現(xiàn)NFC驅(qū)動(dòng),然后自己在應(yīng)用層上面做適配。但是Linux也已經(jīng)推出NFC子系統(tǒng),很多廠家也逐步在統(tǒng)
    發(fā)表于 01-04 14:01 ?2139次閱讀

    Linux Led子系統(tǒng)代碼框架分析

    代碼框架分析 led-class.c (led 子系統(tǒng)框架的入口) 維護(hù) LED 子系統(tǒng)的所有 LED
    的頭像 發(fā)表于 07-20 10:36 ?819次閱讀

    Linux內(nèi)核之LED子系統(tǒng)

    Linux內(nèi)核的LED子系統(tǒng)種重要的框架,用于管理和控制設(shè)備上的LED指示燈。在嵌入式系統(tǒng)
    發(fā)表于 10-02 16:53 ?1458次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核之<b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>(<b class='flag-5'>一</b>)

    Linux內(nèi)核之LED子系統(tǒng)(二)

    這里說(shuō)說(shuō)LED子系統(tǒng)些核心源代碼文件,是如何實(shí)現(xiàn)LED子系統(tǒng)
    發(fā)表于 10-02 16:55 ?1060次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核之<b class='flag-5'>LED</b><b class='flag-5'>子系統(tǒng)</b>(二)

    Linux reset子系統(tǒng)有什么功能

    Linux reset子系統(tǒng) reset子系統(tǒng)非常簡(jiǎn)單,與clock子系統(tǒng)非常類似,但在驅(qū)動(dòng)實(shí)現(xiàn)上,reset驅(qū)動(dòng)更簡(jiǎn)單。 因?yàn)閏lock驅(qū)動(dòng)主要是時(shí)鐘的實(shí)現(xiàn),涉及到固定時(shí)鐘、分頻、門(mén)
    的頭像 發(fā)表于 09-27 14:06 ?810次閱讀
    <b class='flag-5'>Linux</b> reset<b class='flag-5'>子系統(tǒng)</b>有什么功能

    Linux網(wǎng)絡(luò)子系統(tǒng)的實(shí)現(xiàn)

    Linux網(wǎng)絡(luò)子系統(tǒng)的分層 Linux網(wǎng)絡(luò)子系統(tǒng)實(shí)現(xiàn)需要: l 支持不同的協(xié)議族 ( INET, INET6, UNIX, NETLINK...) l 支持不同的網(wǎng)絡(luò)設(shè)備 l 支持
    的頭像 發(fā)表于 11-11 11:25 ?1416次閱讀
    <b class='flag-5'>Linux</b>網(wǎng)絡(luò)<b class='flag-5'>子系統(tǒng)</b>的實(shí)現(xiàn)

    讀懂,什么是BLE?

    讀懂,什么是BLE?
    的頭像 發(fā)表于 11-27 17:11 ?2507次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>,什么是BLE?

    讀懂MSA(測(cè)量系統(tǒng)分析)

    讀懂MSA(測(cè)量系統(tǒng)分析)
    的頭像 發(fā)表于 11-01 11:08 ?1103次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>MSA(測(cè)量<b class='flag-5'>系統(tǒng)</b>分析)
    二八杠算法| 大发888中文版| 大亨百家乐游戏| 百家乐官网入庄闲概率| 百家乐官网试玩账户| bet365充值| 威尼斯人娱乐城会员注册| 网络百家乐金海岸破解软件| 百家乐有免费玩| 百家乐官网怎么玩请指教| 广州百家乐官网赌博机| 缙云县| 棋牌娱乐平台| 威尼斯人娱乐场官网48008| 百家乐博赌场| 澳门百家乐网上赌| 择日自学24| 百家乐官网庄闲出现几| 百家乐官网小钱赢钱| 滨海湾百家乐官网娱乐城| 外围赌球| 肯博88网| 大发888娱乐官网地址| 贵族百家乐的玩法技巧和规则| 百家乐赌博玩法技巧| 澳门1百家乐网| 澳门百家乐单注下限| 百家乐开户送彩网址| 百家乐官网秘籍下注法| 百家乐官网庄闲的分布| 百家乐官网娱乐官方网| 网上百家乐官网靠谱吗| 赌博百家乐官网赢不了| 百家乐官网视频计牌器| 太阳城百家乐官网软件| 百家乐官网视频游365| 永利高百家乐官网怎样开户| 克拉克百家乐官网下载| 百家乐官网视频聊天游戏| 百家乐官网真人秀| 百家乐官网有真假宝单吗|