i2c adapter驱动

I2C adapter驱动框架

struct xxx_i2c {
	void __iomem *base;		/* 用于map外设寄存器 */
	struct device *dev;		/* 无特殊途 */
	struct i2c_adapter adap;	/* adapter 数据结构 */
	struct clk *clk;
	u32 quick;				/* 设备支持的能力 */
};

static u32 xxx_i2c_functionality(struct i2c_adapter *adap)
{
	struct s5pv210_i2c *i2c = container_of(adap, struct s5pv210_i2c, adap);
	return i2c->quick;
}

static int xxx_smbus_xfer(struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, 
							  u8 cmd, int size, union i2c_smbus_data *data)
{
	return 0;
}

static const struct i2c_algorithm xxx_i2c_algo = {
	.smbus_xfer = xxx_smbus_xfer,				/* I2C 控制器收发数据 */
	.functionality = xxx_i2c_functionality,		/* 获取设备支持的功能*/
};

static int xxx_i2c_register(struct xxx_i2c *i2c)
{
	struct i2c_adapter *adap = &i2c->adap;

	adap->algo = &xxx_i2c_algo;
	adap->algo.dev.of_node = i2c->dev->of_node;
	adap->alog.dev.parent = i2c->dev;
	adap->owner = THIS_MODULE;
	
	adap->quick = I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_I2C;
	
	return i2c_add_adapter(adap);	/* 添加适配器到内核*/
}

static int xxx_i2c_probe(struct platform_device *pdev)
{
	struct xxx_i2c *i2c;
	int ret;
	
	i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);	/* 分配设备私有数据 */
	if (!i2c)
		return -ENOMEM;
	
	i2c->dev = &pdev->dev;
	i2c->base = devm_platform_ioremap_resource(pdev, 0);	/* map 寄存器内存 */

	if (IS_ERR(i2c->base)) {
		return PTR_ERR(i2c->base);
	}

	ret = xxx_i2c_register(i2c);
	
	if (ret)
		return ret;
	
	platform_set_drvdata(pdev, i2c);
	return 0;
}

static int xxx_i2c_remove(struct platform_device *pdev)
{
	struct xxx_i2c *i2c = platform_get_drvdata(pdev);
	
	i2c_del_adapter(&i2c->adap);
	return 0;
}

const struct of_device_id xxx_ids[] = {
	{.compatible = "xxx,i2c-adapter"},
};
struct platform_driver xxx_i2c_adap_drv = {
	.probe = xxx_i2c_probe,
	.remove = xxx_i2c_remove,
	.driver = {
		.name = "xxx-i2c-adaper",
		.of_match_table = xxx_ids,
	},
};
module_platform_driver(xxx_i2c_adap_drv);
	在I2C adapter驱动中algo中的functionality回调函数返回设备支持的功能,这些功能的定义在uapi/linux/i2c.h中。		
smbus_xfer这个函数用于向I2C设备发送数据。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值