1. 程式人生 > >[RK3288][Android6.0] PMIC之RK818驅動小結

[RK3288][Android6.0] PMIC之RK818驅動小結

uboot部分:
pmic_init ->    power_rockchip.c
    pmic_rk818_init ->    pmic_rk818.c
        rk818_parse_dt ->
            fdt_get_i2c_info    
            rk818_i2c_probe ->
                i2c_set_bus_num
                i2c_init ->    //RK818_I2C_SPEED是200K
                    rk_i2c_init ->    //設定複用功能以及clock
                        rk_i2c_iomux
                        rk_i2c_set_clk
                    i2c_probe    //探測chip
            fdt_for_each_subnode    
            fdt_regulator_match    //依次匹配regulator下的各個電源節點,值存到rk818_reg_matches中
            rk818_set_regulator_init -> //當最大和最小電壓相同並且設定了regulator-boot-on的話就enable電壓.
                rk818_regulator_set_voltage    //先set再enable
                rk818_regulator_enable
        rk818_pre_init    //enable lcd power以及其他ldo
        fg_rk818_init    //battery相關,暫時未用.

所以說如果想在uboot中就enable相應的dc/dc或者ldo, 那麼在dts要設定成regulator-boot-on以及
regulator-min-microvolt和regulator-max-microvolt要一致.

kernel部分:

rk818_module_init ->    rk818.c
    rk818_i2c_probe ->
        rk818_pre_init
        rk818_parse_dt ->    //解析和uboot類似,只是最後存放的結構體有些變化和差異.
            of_regulator_match ->    of_regulator.c
                of_get_regulator_init_data ->
                    of_get_regulation_constraints //獲取各個電源下的各項屬性.
        regulator_register    -> core.c//註冊所有的regulator
            device_register    //以名字為regulator.x的方式註冊,可以在/sys/class/regulator看到註冊的各個regulators.
            set_machine_constraints ->
                _regulator_do_enable    //如果是always_on或者是boot_on就enable起來.
            list_add    //新增到regulator_list連結串列中.
        rk818_irq_init ->
            irq_domain_add_linear    //建立一個線性對映的domain, rk818的rtc和battery驅動會用它(用irq_create_mapping()定義).
                                    //相關知識: 中斷code用IRQ number(虛擬值)標示,而中斷controller用HW ID表示,兩者需要轉換,當一個模組的
                                    //中斷數比較多時,可以通過建立一個對映(IRQ Domain)實現(也就是這裡的irq_domain_add_linear()),
                                    //具體的IRQ number如何和HW id對應,就通過irq_create_mapping()定義了,這樣就得到對應的IRQ number後
                                    //就可以同樣方法用request_threaded_irq()註冊中斷了.
            request_threaded_irq    //之前有說過,INT腳會發送過流,過壓,RTC等給cpu,中斷函式就是這個,注意裡面還有中斷巢狀會呼叫對應小模組的中斷函式,比如rtc-rk818.c的alarm中斷.
        mfd_add_devices    //新增rtc和battery的platform_device, 接下來就會匹配各自的驅動了,後面再小結對應的驅動.
        register_syscore_ops    //註冊系統關機函式是rk818_shutdown(), 關機跑syscore_shutdown()會調到它.