一、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;
}