led沒那么簡單,
共 891字,需瀏覽 2分鐘
·
2024-04-20 09:17
最近項目上遇到LED的問題,硬是把不用加班的時間搞到周末都需要加班分析問題,而且冷靜下來之后發(fā)現(xiàn)都是非常簡單的小細(xì)節(jié),也正是這些小細(xì)節(jié)讓我們受挫,而且也不能說是誰誰的問題,因為出了問題都是有責(zé)任的。
所以我一直信奉之前團(tuán)隊的一句話,即使是一個GPIO口的變動,都需要認(rèn)真謹(jǐn)慎。
我這里提到的LED不簡單,指的是Linux內(nèi)核下的LED架構(gòu)不簡單,Linux下的LED架構(gòu)幾乎考慮到了很多我們所需要的場景,如果你能理解它,并且學(xué)會用它來幫助你的工作,一定是事半功倍的。
我寫過的一篇Linux架構(gòu)的文章
LED燈的核心需要解決很多問題,第一個問題就是接口,LED燈可以有各種不同的接口
其次是,每個LED設(shè)備具備什么能力,最基礎(chǔ)的就是亮滅,那還有呼吸,閃爍,這些是不是需要定時器,那作為LED的核心怎么把這些東西給驅(qū)動準(zhǔn)備好,這就不得不涉及到LED的trigger。
第三個問題就是一個驅(qū)動怎么去應(yīng)對多個設(shè)備,我看了很多廠家寫的LED驅(qū)動,有的直接就寫hardcore實現(xiàn),完全脫離了LED的架構(gòu),這樣實現(xiàn)并沒有問題,只是這樣就很不Linux了,所以驅(qū)動就需要動態(tài)申請設(shè)備的內(nèi)存,并且要用鏈表綁定起來,這又不得不提到Linux下的數(shù)據(jù)結(jié)構(gòu)了。
學(xué)Linux先從LED開始真的是一點壞處都沒有。
上面提到的trigger其實并不是一定每個驅(qū)動都需要的,所以很多驅(qū)動就會加宏來控制。
還有一些常見的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)
還有常見的瑞士軍刀,這些都是為了避免全局變量,讓代碼更加優(yōu)雅
還有設(shè)置各種不同的LED結(jié)構(gòu)體
最核心的就是這個setbrightness指針
還有這個最大的亮度,這個變量非常有用,可以讓驅(qū)動設(shè)置亮度的最大值,比如我們有的LED燈是三色燈,這個時候就需要把這個值設(shè)置對應(yīng)大一些,相應(yīng)的,也要在setbrightness函數(shù)上做處理。
好了,就談這些,用面向?qū)ο蟮乃枷肴タ磧?nèi)核,會更有收獲。
