正点原子官方文档的代码结构太乱,我于是这样做了。
我将主要的程序分2部分:
- 第一部分:my_ap3216c.c
- 第二部分:my_ap3216c_base.c
第一部分放 Linux 驱动框架,比如 fops 函数, platform 框架这些。
第二部分放 ap3216c 底层驱动,包括向ap3216c 如何读一个字节,写一个字节,从其寄存器读有效数据这些细节的东西。
但是 make 的时候总是出现如下错误,
Makefile 我也不知道怎么改,因此又合二为一了。
另外,官方文档的代码的ap3216c 底层驱动太乱,数了数,要最后调用总共有4层( 调用链:ap3216c_readdata ---> ap3216c_read_reg--->ap3216c_read_regs---> i2c_transfer)
我干脆只写了一个 ap_readonebyte( 调用链:ap3216c_readdata ---> ap_readonebyte ----> i2c_transfer)
另外,还有一些问题搞不懂:
- 为什么 dev 要有 private_data,它是什么?
- 为什么fops 的 read函数 中,参数 *private_data; 成为了 struct i2c_client ?
- i2c 的 gpio 如何初始化呢?(例程中没有获取节点、获取 gpio 编号、 设置为输出的代码)
- 为什么i2c platform 的 probe 函数和原来 platform 的不一样?
ap3216c_probe(struct i2c_client *client, const struct i2c_device_id *id)
参数 *client, id 到底是什么? 为什么不用原来的 struct platform_device *dev