08 在設備樹裏描述platform_device【轉】

轉自:https://blog.csdn.net/jklinux/article/details/78575281node

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/jklinux/article/details/78575281
在設備樹的dts文件裏,帶有compatible屬性的節點就是表示一個platform_device.linux

在設備樹裏增長一個設備,則在內核裏的dts文件裏描述設備節點便可. 在H5方案裏,則在arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2.dts文件裏。
如在dts文件里加入如下內容:ide

mynodes@77885566 { /* 則建立出來的platform_device的名爲mynodes@77885566 */
compatible = "mynodes"; /* 設備節點的屬性 */
autorepeat = <1>;函數

btn1 { /* 設備子節點 */
label = "btn1"; /* 設備子節點的屬性 */
code = <0x11>;
};
btn2 {
label = "btn2";
code = <0x22>;
};
};

增長內容後,則重編設備樹:.net

make dtbs ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
1
再把編譯出來的sun50i-h5-nanopi-neo2.dtb替換板上所用的dtb文件,重啓系統後,能夠查看到內容:code

^_^ / # ls /sys/bus/platform/devices/mynodes@77885566/
driver_override of_node/ subsystem/
modalias power/ ueventorm

^_^ / # ls /sys/bus/platform/devices/mynodes@77885566/of_node/
autorepeat btn1/ btn2/ compatible name
1
2
3
4
5
6
在dst設備樹文件描述設備後就須要與platform_driver進行匹配和驅動了.
在設備驅動裏獲取設備樹中的設備資源須要一套接口函數來實現:對象

#include <linux/property.h>blog

//用於獲取設備節點的屬性成員值函數, propname用於指定要獲取值的屬性名
bool device_property_present(struct device *dev, const char *propname);
int device_property_read_u8_array(struct device *dev, const char *propname,
u8 *val, size_t nval);
int device_property_read_u16_array(struct device *dev, const char *propname,
u16 *val, size_t nval);
int device_property_read_u32_array(struct device *dev, const char *propname,
u32 *val, size_t nval);
int device_property_read_u64_array(struct device *dev, const char *propname,
u64 *val, size_t nval);
int device_property_read_string_array(struct device *dev, const char *propname,
const char **val, size_t nval);
int device_property_read_string(struct device *dev, const char *propname,
const char **val);
int device_property_match_string(struct device *dev,
const char *propname, const char *string);接口

//用於獲取設備子節點的屬性值函數. fwnode是表示子節點的對象地址
bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname);
int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
const char *propname, u8 *val,
size_t nval);
int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
const char *propname, u16 *val,
size_t nval);
int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
const char *propname, u32 *val,
size_t nval);
int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
const char *propname, u64 *val,
size_t nval);
int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
const char *propname, const char **val,
size_t nval);
int fwnode_property_read_string(struct fwnode_handle *fwnode,
const char *propname, const char **val);
int fwnode_property_match_string(struct fwnode_handle *fwnode,
const char *propname, const char *string);

struct fwnode_handle *device_get_next_child_node(struct device *dev,
struct fwnode_handle *child);


----------
unsigned int device_get_child_node_count(struct device *dev); //獲取設備的子節點個數

//產生一個for循環用於檢查全部的子節點
#define device_for_each_child_node(dev, child) \
for (child = device_get_next_child_node(dev, NULL); child; \
child = device_get_next_child_node(dev, child))

//注意函數以"device"開頭表示讀取設備的屬性, 以"fwnode"開頭表示讀取子節點的屬性.

用於獲取mynodes設備資源的驅動源碼:

/* mydrv.c */

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/property.h>

int myprobe(struct platform_device *pdev)
{
struct fwnode_handle *fwhandle;
const char *str;
u32 val;

//獲取設備子節點的個數
printk("child node count : %d\n", device_get_child_node_count(&pdev->dev));
//獲取設備屬性autorepeat的值
printk("%d\n", device_property_read_bool(&pdev->dev, "autorepeat"));

//遍歷設備的每一個子節點
device_for_each_child_node(&pdev->dev, fwhandle) {
//獲取設備子節點的label屬性值
fwnode_property_read_string(fwhandle, "label", &str);
printk("label = %s\n", str);
//獲取設備子節點的code屬性值
fwnode_property_read_u32(fwhandle, "code", &val);
printk("code = %x\n", val);
};

return 0;
}

int myremove(struct platform_device *pdev)
{
printk("in myremove ...\n");
return 0;
}

struct of_device_id ids[] = {
{.compatible = "mynodes"},
{},
};

struct platform_driver mydrv = {
.probe = myprobe,
.remove = myremove,

.driver = {
.owner = THIS_MODULE,
.name = "mydrv" ,

.of_match_table = ids,
},
};

module_platform_driver(mydrv);
MODULE_LICENSE("GPL");
1
2
編譯驅動模塊加載後的輸出結果:

[ 419.424065] child node count : 2[ 419.427429] 1[ 419.429054] label = btn1[ 419.431690] code = 11[ 419.434000] label = btn2[ 419.436623] code = 22————————————————版權聲明:本文爲CSDN博主「jklinux」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/jklinux/article/details/78575281

相關文章
相關標籤/搜索