• msm 模拟i2c使用过程分析


    //配置原有i2为GPIO模式
    --- a/arch/arm/mach-msm/board-msm7x27a.c
    +++ b/arch/arm/mach-msm/board-msm7x27a.c
    @@ -4569,9 +4569,9 @@ static void __init msm_device_i2c_init(void)
            gpio_tlmm_config(GPIO_CFG(I2C0_SCL, 0, GPIO_CFG_OUTPUT,
                                                   GPIO_CFG_PULL_UP, GPIO_CFG_8MA),GPIO_CFG_ENABLE);
            gpio_tlmm_config(GPIO_CFG(I2C1_SDA, 0, GPIO_CFG_OUTPUT,
    -                                                  GPIO_CFG_PULL_UP, GPIO_CFG_8MA),GPIO_CFG_ENABLE);
    +                                                  GPIO_CFG_PULL_UP, GPIO_CFG_6MA),GPIO_CFG_ENABLE);
            gpio_tlmm_config(GPIO_CFG(I2C1_SCL, 0, GPIO_CFG_OUTPUT,
    -                                              GPIO_CFG_PULL_UP, GPIO_CFG_8MA),GPIO_CFG_ENABLE);
    +                                              GPIO_CFG_PULL_UP, GPIO_CFG_6MA),GPIO_CFG_ENABLE);
     #else
            msm_gsbi0_qup_i2c_device.dev.platform_data = &msm_gsbi0_qup_i2c_pdata;
            msm_gsbi1_qup_i2c_device.dev.platform_data = &msm_gsbi1_qup_i2c_pdata;


    由于硬件设计问题.硬件i2c不稳定,导致FM打开时而失败.

    现在采用把原来的硬件i2c改成模拟i2c控制

    高通模拟GPIO的GPIO配置, 因为板子在8MA的情况 i2c非常不稳定, 改到6ma改善很大.所以目前采用6ma的大小.

    --- a/arch/arm/mach-msm/Kconfig
    +++ b/arch/arm/mach-msm/Kconfig
    @@ -1708,4 +1708,11 @@ config MSM_L2_SPM
              Enabling this driver allows configuring L2 SPM for low power modes
              on supported chipsets.
     
    +config HY_I2C_DEVICE_USE_GPIO
    +       bool "HY_I2C_DEVICE_USE_GPIO"
    +   depends on I2C_GPIO
    +   default n
    +       help
    +         This is the macro all i2c devices use i2c-gpio mode.
    +

    --- a/arch/arm/mach-msm/board-msm7x27a.c
    +++ b/arch/arm/mach-msm/board-msm7x27a.c
    @@ -96,6 +96,43 @@
     #define FM_GPIO        83
     #define GPIO_INVALID NR_MSM_GPIOS
     
     
    +#ifdef CONFIG_HY_I2C_DEVICE_USE_GPIO
    +#include <linux/i2c-gpio.h> // ynn add 
    +#define I2C0_SCL 60
    +#define I2C0_SDA 61
    +#define I2C1_SCL 131
    +#define I2C1_SDA 132
    //创建i2c 平台设备相关结构体
    +struct i2c_gpio_platform_data platform_data_gpio_i2c1 = { 
    +       .scl_pin = I2C1_SCL,
    +       .sda_pin = I2C1_SDA,
    +       .udelay =2,
    +     // .scl_is_output_only=0,
    +};
    +
    +struct platform_device msm_device_gpio_i2c1 = {
    +       .name   = "i2c-gpio",
    +       .id     = MSM_GSBI1_QUP_I2C_BUS_ID,//1,
    +       .dev    = {
    +               .platform_data = &platform_data_gpio_i2c1,
    +       }
    +};
    +
    +struct i2c_gpio_platform_data platform_data_gpio_i2c0 = {
    +       .scl_pin = I2C0_SCL,
    +       .sda_pin = I2C0_SDA,
    +       .udelay =2,
    +};
    +
    +struct platform_device msm_device_gpio_i2c0 = { // for camera
    +       .name   = "i2c-gpio",
    +       .id     = MSM_GSBI0_QUP_I2C_BUS_ID,//0, 
    +       .dev    = {
    +               .platform_data = &platform_data_gpio_i2c0,
    +       }
    +};     
    +#endif
     
    // 注册i2c adapter 设备
    @@ -4089,8 +4126,13 @@ static struct platform_device *rumi_sim_devices[] __initdata = {
            &msm_device_uart1,
            &msm_device_nand,
            &msm_device_uart_dm1,
    +#ifdef CONFIG_HY_I2C_DEVICE_USE_GPIO
    +       &msm_device_gpio_i2c0,
    +       &msm_device_gpio_i2c1,
    +#else  
    
            &msm_gsbi0_qup_i2c_device,
            &msm_gsbi1_qup_i2c_device,
    +#endif
    
    驱动采用ls drivers/i2c/busses/i2c-gpio.c 


  • 相关阅读:
    Codeforces Round #353 (Div. 2)
    Codeforces Round #304 (Div. 2)
    Codeforces Round #250 (Div. 2)D
    Codeforces Round #368 (Div. 2)
    hdu4348区间更新的主席树+标记永久化
    poj3468线段树标记永久化
    Educational Codeforces Round 35 (Rated for Div. 2)
    一维数组取一部分
    序列化数组。
    禅道常识
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124143.html
Copyright © 2020-2023  润新知