全志V3s IIC控制器驱动分析

设备树节点

i2c0: i2c@01c2ac00 {
	compatible = "allwinner,sun6i-a31-i2c";
	reg = <0x01c2ac00 0x400>;
	interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
	clocks = <&ccu CLK_BUS_I2C0>;
	resets = <&ccu RST_BUS_I2C0>;
	pinctrl-names = "default";
	pinctrl-0 = <&i2c0_pins>;
	status = "disabled";
	#address-cells = <1>;
	#size-cells = <0>;
};

控制器驱动源码路径

linux-5.1.0\drivers\i2c\busses\i2c-mv64xxx.c

控制器结构体与注册到核心层

linux-5.1.0\include\linux\i2c.h
struct i2c_adapter adapter;
linux-5.1.0\drivers\i2c\i2c-core-base.c
int i2c_add_numbered_adapter(struct i2c_adapter *adap);

控制器设备树节点包括外设子节点,记录到adapter结构体
drv_data->adapter.dev.of_node = pd->dev.of_node;

iic控制器驱动platform的probe函数调用流程

mv64xxx_i2c_probe
    i2c_add_numbered_adapter /* 添加I2C控制器 */
        __i2c_add_numbered_adapter
            i2c_register_adapter /* 注册I2C控制器 */
                device_register /* I2C控制器设备注册 */
                of_i2c_register_devices
                	 /* 从设备树中把与该adapter匹配的iic控制器设备树节点找出来 */
                	bus = of_get_child_by_name(adap->dev.of_node, "i2c-bus");
                	/*解析设备树iic控制器节点,根据设备树的iic外设节点创建client */
                    client = of_i2c_register_device(adap, node);  
                        i2c_new_device
	                        // client是根据当前注册的adapter创建的,所以直接绑定adapter,以后不用再为client找adapter。
                        	client->adapter = adap;  
                        	// i2c外设client都绑定该i2c总线,不管这个client属于哪个adapter,client与adapter的关系已在上一步表述清楚,这一步是外设与外设驱动的总线匹配关系。 
                        	// 不过该client属于哪个adapter,都是通过同一条i2c_bus_type的i2c_device_match函数匹配,换言之,外设驱动适合所有adapter的外设client,只要i2c_bus_type的i2c_device_match匹配成功。
                            client->dev.bus = &i2c_bus_type; 
                            device_register /* 添加设备I2C从设备 */
                i2c_scan_static_board_info /* 查找静态表,有些I2C设备是在代码中写死的,不是通过设备树的形式 */
                    i2c_new_device
                        client->dev.bus = &i2c_bus_type;

注册前为什么需要申请中断?

drv_data->irq = platform_get_irq(pd, 0);
rc = request_irq(drv_data->irq, mv64xxx_i2c_intr, 0, MV64XXX_I2C_CTLR_NAME, drv_data);

看设备树中断描述
interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
SPI:shared processor interrupts 的第6号中断,参考: 设备树中的interrupts属性解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fiveyear_chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值