一、for_each_child_of_node遍历所有子节点
#define for_each_child_of_node(parent, child) \
for (child = of_get_next_child(parent, NULL); child != NULL; \
child = of_get_next_child(parent, child))
二、实例
&pwm0 {
status = "okay";
interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
compatible = "rockchip,remotectl-pwm";
remote_pwm_id = <0>;
handle_cpu_id = <0>;
red_green_led_gpio =<&gpio0 13 GPIO_ACTIVE_LOW>;
ir_key1{
rockchip,usercode = <0xf708>;
rockchip,key_table =
<0xFF KEY_POWER>,
<0xF4 KEY_MENU>,
<0xF6 KEY_BACK>,
<0xE9 KEY_HOME>,
<0xF1 KEY_ENTER>,
<0xEE KEY_VOLUMEUP>,
<0xEB KEY_VOLUMEDOWN>,
<0xE9 KEY_REPLY>,
<0xF3 KEY_UP>,
<0xEF KEY_DOWN>,
<0xF2 KEY_LEFT>,
<0xF0 KEY_RIGHT>,
<0xFA KEY_PLAY>,
<0xE6 KEY_PLAYCD>,
<0xE7 KEY_STOP>,
<0xEC KEY_MUTE>,
<0xE5 KEY_1>,
<0xE4 KEY_2>,
<0xE3 KEY_3>,
<0xE2 KEY_4>,
<0xE1 KEY_5>,
<0xE0 KEY_6>,
<0xBF KEY_7>,
<0xBE KEY_8>,
<0xBD KEY_9>,
<0xBB KEY_0>,
<0xE8 KEY_APPSELECT>,
<0xBC KEY_NUMERIC_STAR>,
<0xBA KEY_NUMERIC_POUND>;
};
ir_key2{
rockchip,usercode = <0xff00>;
rockchip,key_table =
<0xBA KEY_POWER>,
<0xB8 KEY_MENU>,
<0xA1 KEY_BACK>,
<0xEA KEY_ENTER>,
<0xBF KEY_UP>,
<0xE6 KEY_DOWN>,
<0xF8 KEY_LEFT>,
<0xF6 KEY_RIGHT>,
<0xF3 KEY_INFO>;
};
static int rk_remotectl_parse_ir_keys(struct platform_device *pdev)
{
struct rkxx_remotectl_drvdata *ddata = platform_get_drvdata(pdev);
struct device_node *node = pdev->dev.of_node;
struct device_node *child_node;
int loop;
int ret;
int len;
int boardnum;
boardnum = 0;
for_each_child_of_node(node, child_node) {
if(of_property_read_u32(child_node, "rockchip,usercode",
&remotectl_button[boardnum].usercode)) {
dev_err(&pdev->dev, "Missing usercode property in the DTS.\n");
ret = -1;
return ret;
}
DBG("remotectl_button[0].usercode=0x%x\n",
remotectl_button[boardnum].usercode);
of_get_property(child_node, "rockchip,key_table", &len);
len /= sizeof(u32);
DBG("len=0x%x\n",len);
remotectl_button[boardnum].nbuttons = len/2;
if(of_property_read_u32_array(child_node, "rockchip,key_table",
(u32 *)remotectl_button[boardnum].key_table, len)) {
dev_err(&pdev->dev, "Missing key_table property in the DTS.\n");
ret = -1;
return ret;
}
for (loop=0; loop<(len/2); loop++) {
DBG("board[%d].scanCode[%d]=0x%x\n", boardnum, loop,
remotectl_button[boardnum].key_table[loop].scancode);
DBG("board[%d].keyCode[%d]=%d\n", boardnum, loop,
remotectl_button[boardnum].key_table[loop].keycode);
}
boardnum++;
if (boardnum > ddata->maxkeybdnum)
break;
}
red_green_led_gpio = of_get_named_gpio(node,"red_green_led_gpio", 0);
DBG("keybdNum=0x%x\n",boardnum);
return 0;
}