微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 关于6795平台上i2c-4的使用

关于6795平台上i2c-4的使用

时间:10-02 整理:3721RD 点击:

[Description]

MT6795平台支持到I2C-4,但是软件中并没有打开,应该怎么使用?

[Solution]

1.lk部分配置:
1)bootable/bootloader/lk/platform/mt6795/mt_i2c.c中
652void _config_mt_i2c(mt_i2c *i2c)
653{
654 //I2CFUC();
655 switch(i2c->id)
656 {
657 case 0:
658 i2c->base = I2C0_BASE;
659 break;
660 case 1:
661 i2c->base = I2C1_BASE;
662 break;
663 case 2:
664 i2c->base = I2C2_BASE;
665 break;
case 4: //<== Add this line
i2c->base = I2C4_BASE;
break;
666 default:
667 I2CERR("invalid para: i2c->id=%d\n",i2c->id);
668 break;
669 }
2) /bootable/bootloader/lk/platform/mt6795/include/platform/mt_i2c.h中添加
#ifndef I2C4_BASE
// APB Module i2c
#define I2C4_BASE (0x11011000)
#endif
3)/bootable/bootloader/lk/platform/mt6795/include/platform/project.h对照i2c2的部分添加
i2c4的部分:
3451// APB Module i2c
3452#define I2C4_BASE (0x11011000)
3453#define I2C4_I2CREG_DATA_PORT ((UINT16P)(I2C4_BASE+0x000))
3454#define I2C4_I2CREG_SLAVE_ADDR ((UINT16P)(I2C4_BASE+0x004))
3455#define I2C4_I2CREG_INTERRUPT_MASK ((UINT16P)(I2C4_BASE+0x008))
3456#define I2C4_I2CREG_INTERRUPT_STATUS ((UINT16P)(I2C4_BASE+0x00C))
3457#define I2C4_I2CREG_CONTROL ((UINT16P)(I2C4_BASE+0x010))
3458#define I2C4_I2CREG_TRANSFER_LENGTH ((UINT16P)(I2C4_BASE+0x014))
3459#define I2C4_I2CREG_TRANSAC_LENGTH ((UINT16P)(I2C4_BASE+0x018))
3460#define I2C4_I2CREG_DELAY_LENGTH ((UINT16P)(I2C4_BASE+0x01C))
3461#define I2C4_I2CREG_TIMING ((UINT16P)(I2C4_BASE+0x020))
3462#define I2C4_I2CREG_START ((UINT16P)(I2C4_BASE+0x024))
3463#define I2C4_I2CREG_EXT_CONF ((UINT16P)(I2C4_BASE+0x028))
3464#define I2C4_I2CREG_FIFOSTAT ((UINT16P)(I2C4_BASE+0x030))
3465#define I2C4_I2CREG_FIFOTHRESH ((UINT16P)(I2C4_BASE+0x034))
3466#define I2C4_I2CREG_FIFOADDRCLR ((UINT16P)(I2C4_BASE+0x038))
3467#define I2C4_I2CREG_IO_CONFIG ((UINT16P)(I2C4_BASE+0x040))
3468#define I2C4_I2CREG_MULTIMAS ((UINT16P)(I2C4_BASE+0x044))
3469#define I2C4_I2CREG_HS ((UINT16P)(I2C4_BASE+0x048))
3470#define I2C4_I2CREG_SOFTRESET ((UINT16P)(I2C4_BASE+0x050))
3471#define I2C4_I2CREG_HW_CG_EN ((UINT16P)(I2C4_BASE+0x054))
3472#define I2C4_I2CREG_DEBUG_STATUS ((UINT16P)(I2C4_BASE+0x064))
3473#define I2C4_I2CREG_DEBUG_CTRL ((UINT16P)(I2C4_BASE+0x068))
2.kernel部分配置
1) 修改alps/kernel-3.10/arch/ARM64/boot/dts/mt6795.dtsi中打开i2c-4部分的注释:
704 I2C4@0x11011000 {
705 compatible = "mediatek,I2C4";
706 cell-index = ;
707 reg = ;
708 interrupts = ;
709 def_speed = ;
710 };
//<==打开此部分的注释
2)修改alps/kernel-3.10/drivers/misc/mediatek/i2c/mt6795/i2c.c中
1525 switch(i2c->id){
1526 case 0:
1527 i2c->pdn = MT_CG_PERI_I2C0;
1528 break;
1529 case 1:
1530 i2c->pdn = MT_CG_PERI_I2C1;
1531 break;
1532 case 2:
1533 i2c->pdn = MT_CG_PERI_I2C2;
1534 break;
1535 case 3:
1536 i2c->pdn = MT_CG_PERI_I2C3;
1537 break;
1538 case 4:
1539 //ROME lay out no i2c4
1540 i2c->pdn = MT_CG_PERI_I2C4;//<==Add this line
1541 break;
1542 default:
1543 dev_err(&pdev->dev, "Error id %d\n", i2c->id);
1544 break;
1545 }
……
1654static const struct of_device_id mt_i2c_of_match[] = {
1655 { .compatible = "mediatek,I2C0", },
1656 { .compatible = "mediatek,I2C1", },
1657 { .compatible = "mediatek,I2C2", },
1658 { .compatible = "mediatek,I2C3", },
{ .compatible = "mediatek,I2C4", },//<==Add this line
1659 {/* sentinel */},
1660};
1661
[Notice]
因为6595上的i2c-4是PUSH-PULL的结构,所以需要注意:
1. dws中把这两个GPIO(100、101)配置成SCL、SDA,不拉,HW上也不能接上拉电阻
(请注意修改所有的dws文件,要提防GPIO mode被更改的情况,可以在i2c_probe中
重新写GPIO_MODE);
2.在i2c driver 中通信的时候,msg->ext_flag要加上I2C_PUSHPULL_FLAG;
3.另外,请注意设备的初始化函数需要在i2c common driver初始化之前,因为
i2c_register_board_info()必须在i2c_add_adapter()之前执行。这个部分可以在设
备的init函数中添加log检查。
解决方法:请在alps\kernel-3.10\drivers\misc\mediatek\makefile.mt65XX中将您
新添加的设备module加在gpio之后、i2c之前。

学习学习学习

学习学习学习

学习啦学习了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top