#include
#include
#include
/*************************************************************************************************/
// 局部宏定义
/*************************************************************************************************/
#define EN_DEBUG 1/* 调试信息开关 */
#if EN_DEBUG
#define PRINT(x...) printk(KERN_EMERG x)/* 设置为紧急信息等级 */
#else
#define PRINT(x...)
#endif
/*************************************************************************************************/
// 用来匹配设备的id
/*************************************************************************************************/
static const struct of_device_id of_device_match[] = {
{.compatible = "company name,modle"},
{}
};
/*************************************************************************************************/
// 设备类型id列表
/*************************************************************************************************/
const struct i2c_device_id i2c_device_table[] = {
{"modle", 0},
{},
};
/**************************************************************************************************
** 功能: 本驱动的探针函数,当驱动加载时被调用
** 参数: 无
** 返回: 无
**************************************************************************************************/
int iic_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
int i;
struct device dev; /* 设备对象 */
const char *mstr;
unsigned int mint;
unsigned int marray[10];
dev = client->dev;
memset(marray, 0, sizeof(marray));
of_property_read_u32_array(dev.of_node, "marray", marray, 4); /* 读取节点中属性名为 marray 的数组 */
of_property_read_string(dev.of_node, "mstring", &mstr); /* 读取节点中属性名为 mstring 的字符串 */
of_property_read_u32(dev.of_node, "mint", &mint); /* 读取节点中属性名为 mint 的数字 */
PRINT("%s ------ addr = %x\n", __FUNCTION__, client->addr); /* 打印设备地址,即 reg 属性的值 */
PRINT("%s ------ of_node->name = %s\n", __FUNCTION__, dev.of_node->name); /* 打印节点名称 */
for (i = 0; i < 10; i++) {
PRINT("%s ------ marray[%d] = %d\n", __FUNCTION__, i, marray[i]);
}
PRINT("%s ------ mstr = %s\n", __FUNCTION__, mstr);
PRINT("%s ------ mint = %d\n", __FUNCTION__, mint);
return 0;
}
/**************************************************************************************************
** 功能: 本驱动的移除函数,当驱动卸载时被调用
** 参数: 无
** 返回: 无
**************************************************************************************************/
int iic_remove(struct i2c_client *client)
{
return 0;
}
/* i2c驱动对象 */
struct i2c_driver iic_driver = {
.probe = iic_probe,
.remove = iic_remove,
.driver = {
.name = "iic_dev_name",
.of_match_table = of_match_ptr(of_device_match),
},
.id_table = i2c_device_table,
};
/**************************************************************************************************
** 函数名称: drv_init
** 功能: 驱动初始化函数,在加载时被调用
** 参数: 无
** 返回: 无
**************************************************************************************************/
static int __init drv_init(void)
{
PRINT("%s ------ \n", __FUNCTION__);
i2c_register_driver(THIS_MODULE, &iic_driver); /* 注册i2c驱动 */
return 0;
}
/**************************************************************************************************
** 函数名称: drv_exit
** 功能描述: i2c驱动退出函数,在卸载时被调用
** 参数: 无
** 返回: 无
**************************************************************************************************/
static void __exit drv_exit(void)
{
PRINT("%s ------ \n", __FUNCTION__);
i2c_del_driver(&iic_driver); /* 移除i2c驱动 */
}
module_init(drv_init); /* 模块初始化 */
module_exit(drv_exit); /* 模块卸载 */
MODULE_AUTHOR("hrx"); /* 模块作者 */
MODULE_DESCRIPTION("Linux Driver"); /* 模块描述 */
MODULE_VERSION("1.0.0"); /* 模块版本 */
MODULE_LICENSE("GPL"); /* 模块遵守的License */