? ? ?大家好,今天主要和大家聊一聊,如何使用linux系統(tǒng)中的設(shè)備樹控制led。
目錄
第一:設(shè)備樹LED基本驅(qū)動原理
第二:LED燈驅(qū)動程序的實(shí)現(xiàn)
?
第一:設(shè)備樹LED基本驅(qū)動原理
? ? ? 本次實(shí)驗(yàn)采用設(shè)備樹向linux內(nèi)核傳遞相關(guān)的寄存器物理地址,linux驅(qū)動文件使用of函數(shù)從設(shè)備樹中獲取所需的屬性值,然后使用獲取到的屬性值初始化相關(guān)的IO。
第二:修改設(shè)備樹文件
? ? ? 在根節(jié)點(diǎn)"/" 下創(chuàng)建一個名為alphaled的子節(jié)點(diǎn),打開imx6ull-alientek-emmc.dts文件,在根節(jié)點(diǎn)“/”最后面輸入如下所示的內(nèi)容:
alphaled{
#address-cells = <1>;
#size-cells = <1>;
compatible = "atkalpha-led";
status = "okay";
reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */
0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */
0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */
0X0209C000 0X04 /* GPIO1_DR_BASE */
0X0209C004 0X04 >; //GPIO1_GDIR_BASE
};
? ? ? ? 分析:屬性#address-cells和#size-cells都為1,表示reg屬性中起始地址占用一個32位長度,地址長度也占用一個32位長度。
? ? ? ? ? ? ? ? ? 屬性compatbile設(shè)置alphaled節(jié)點(diǎn)兼容性為“atkalpa-led”
? ? ? ? ? ? ? ? ? 屬性status設(shè)置狀態(tài)為“okay”
? ? ? ? ? ? ? ? ?reg屬性,非常重要,reg屬性設(shè)置了驅(qū)動里面所要使用的寄存器物理地址,比如第六行“0X020C406C 0X04”表示CCM_CCGR1寄存器,首地址,長度為4個字節(jié)。
? ? ? ? ?設(shè)備樹修改完成以后需要重新編譯一下,編譯完成以后,重新啟動linux進(jìn)入到/proc/device-tree/目錄中查看是否有"alphaled"這個節(jié)點(diǎn)。
? ? ? ? ? ? ??
? ? ? ?可以進(jìn)入到alphaled目錄中,查看一下都有哪些屬性文件,如圖所示:
? ??
? ? ? ? 大家可以看下compatible,status等屬性值是否和我們設(shè)置的一致。文章來源:http://www.zghlxwxcb.cn/news/detail-405923.html
第二:LED燈驅(qū)動程序的實(shí)現(xiàn)
#include <linux/types.h>
#include <linux/kernel.h>
//dtsled設(shè)備結(jié)構(gòu)體
struct dtsled_dev{
dev_t devid; //設(shè)備號
struct cdev cdev; //cdev
struct class *class; //類
struct device *device; //設(shè)備
int major; //主設(shè)備號
int minor; //次設(shè)備號
struct device_node *nd; //設(shè)備節(jié)點(diǎn)
};
struct dtsled_dev dtsled; //led設(shè)備
//linux驅(qū)動入口函數(shù)
static int __init led_init(void)
{
u32 val = 0;
int ret;
u32 regdata[14];
const char *str;
struct property *proper;
//獲取設(shè)備樹中的屬性數(shù)據(jù)。
dtsled.nd = of_find_node_by_path("/alphaled");
//獲取compatible屬性內(nèi)容的值
proper = of_find_property(dtsled.nd,"compatible",NULL);
//獲取status屬性內(nèi)容
ret = of_property_read_string(dtsled.nd,"status",&str);
//獲取reg屬性內(nèi)容
ret = of_property_read_u32_array(dtsled.nd,"reg",regdata,10);
for(i = 0; i < 10; i++)
printk("%#x", regdata[i]);
}
總結(jié):利用設(shè)備樹獲取必要的信息,再進(jìn)行虛擬的映射技術(shù)進(jìn)行控制,第一次使用加載命令的時候,可以使用depmod? ?以及 modprobe dtsled.ko文章來源地址http://www.zghlxwxcb.cn/news/detail-405923.html
到了這里,關(guān)于linux系統(tǒng)中利用設(shè)備樹完成對LED的控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!