AXP233驱动调试记录
问题描述
遇到的最关键的问题就是:
AXP233是挂在了I2C-0的设备节点上,因为现在的V5的限制,I2C-0这个设备节点,无法在应用层直接操作。
解决办法:
只能开发一个内核驱动,在驱动中抛出应用层可以操作的接口,应用层调用这个接口,这样就可以曲线救国进行控制AXP233了。
具体修改方案
linux-4.4内核的power相关的驱动位置:linux-4.4driverspower
power目录下有个axp目录,可见axpXXX系列的电源驱动都放在了这个目录下面,
打开之后,可以看到axp目录中有axp22x的目录,
位置:linux-4.4driverspoweraxpaxp22x
这个axp22x的目录就是存放axp22x所有的源代码。
axp22x.h和axp22x.c就是首先要看的源代码。
目前为止axp22x中实现了axp221s、axp227、axp223三个电源管理芯片的驱动。是一个大合集。
然后就可以在这个基础上做些工作了:
1、使用misc_register来注册一个特殊的字符设备,给应用层抛出可操作的接口。
misc_device是特殊字符设备。注册驱动程序时采用misc_register函数注册,此函数中会自动创建设备节点,即设备文件。无需mknod指令创建设备文件。因为misc_register()会调用class_device_creat或者device_creat().
https://www.cnblogs.com/ggzhangxiaochao/p/12894883.html 这个解释的挺好的
我主要添加的代码:
代码语言:javascript复制/*********************************************************
* 20230920 zh add
* 控制AXP233电源管理芯片,为应用层程序提供控制接口
**********************************************************/
static ssize_t axp233_ctrl_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
char my_data[] = "Hello from Kernel!n";
size_t len = strlen(my_data);
if (*ppos >= len)
return 0;
if (count > len - *ppos)
count = len - *ppos;
if (copy_to_user(buf, my_data *ppos, count)) {
return -EFAULT;
}
*ppos = count;
return count;
}
static ssize_t axp233_ctrl_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
char user_data[256];
if (count >= sizeof(user_data)) {
return -EINVAL;
}
if (copy_from_user(user_data, buf, count)) {
return -EFAULT;
}
user_data[count] = '