Depuración del chip de administración de energía Quanzhi V5+AXP233

Registro de depuración del controlador AXP233

Descripción del problema

El problema más crítico encontrado es:

AXP233 está colgado en el nodo del dispositivo I2C-0. Debido a las limitaciones actuales de V5, el nodo del dispositivo I2C-0 no se puede operar directamente en la capa de aplicación.

Solución:

Solo puede desarrollar un controlador de kernel, descartar una interfaz que la capa de aplicación pueda operar en el controlador y la capa de aplicación llama a esta interfaz para que pueda controlar el AXP233.

Plan de modificación específico

La ubicación del controlador relacionado con la energía del kernel Linux-4.4: linux-4.4\drivers\power

Hay un directorio axp en el directorio power, se puede ver que los controladores de fuente de alimentación de la serie axpXXX se encuentran en este directorio.

Después de abrir, puede ver que hay un directorio de axp22x en el directorio axp.

Ubicación: linux-4.4\drivers\power\axp\axp22x

Este directorio axp22x almacena todo el código fuente de axp22x.

axp22x.h y axp22x.c son los códigos fuente que debes mirar primero.

Hasta ahora, axp22x ha implementado los controladores de tres chips de administración de energía, axp221s, axp227 y axp223. Es una gran colección.

Entonces puedes trabajar un poco sobre esta base:

1. Utilice misc_register para registrar un dispositivo de caracteres especiales y generar una interfaz operable a la capa de aplicación.

misc_device es un dispositivo de caracteres especiales. Al registrar el controlador, utilice la función misc_register para registrarse. En esta función, el nodo del dispositivo, es decir, el archivo del dispositivo, se creará automáticamente. No se necesita ninguna directiva mknod para crear archivos de dispositivo. Porque misc_register() llamará a class_device_creat o device_creat().

https://www.cnblogs.com/ggzhangxiaochao/p/12894883.html Esta es una buena explicación.

El código principal que agregué:



/*********************************************************
 * 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] = '\0';
    printk("[zh] recv from User user_data: %s\n", user_data);
    printk("[zh] recv from User count: %d\n", count);

    if(strcasecmp(user_data, "power_off") == 0){
    
    
        printk("[zh] 关机 \n");
        // axp22x_power_off();

		pr_info("[axp] off zhenghui ############!\n");
		axp_regmap_set_bits(axp22x_pm_power->regmap, AXP22X_OFF_CTL, 0x80);
    }

    return count;
}

static const struct file_operations axp233_ctrl_fops = {
    
    
    .owner = THIS_MODULE,
    .read = axp233_ctrl_read,
    .write = axp233_ctrl_write,
};

static struct miscdevice axp233_misc_device = {
    
    
    .minor = MISC_DYNAMIC_MINOR,
    .name = "axp233_misc_device",
    .fops = &axp233_ctrl_fops,
};

static int axp233_ctrl_init(void)
{
    
    
    int ret = misc_register(&axp233_misc_device);
    if (ret) {
    
    
        pr_err("[zh]Failed to register misc device\n");
        return ret;
    }
    
    pr_info("[zh]Misc device registered: %s\n", axp233_misc_device.name);
    return 0;
}

static void axp233_ctrl_exit(void)
{
    
    
    misc_deregister(&axp233_misc_device);
    pr_info("[zh]Misc device unregistered\n");
}


// end

Según la descripción en el manual del AXP233, la llamada de apagado debe escribir 1 en el registro REG32H[7] para operar el AXP233 y apagarlo.

Según el estilo del código axp22x.c, la función axp_regmap_set_bits se usa para escribir y la función axp_regmap_read se usa para leer datos.

Y está definido en el archivo de encabezado axp22x.h:

#define AXP22X_OFF_CTL             (0x32)

Para que puedas imitar y escribir, es decir:

axp_regmap_set_bits(axp22x_pm_power->regmap, AXP22X_OFF_CTL, 0x80);

===== Capa de aplicación =====

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    
    
    int fd;
    char buffer[256];
    ssize_t bytes_read;

    fd = open("/dev/axp233_misc_device", O_RDWR);
    if (fd == -1) {
    
    
        perror("打开 axp233_misc_device 失败 \n");
        return 1;
    }

    printf("######## #### #### #### ####  \n");
    printf("正在读数据:\n");
    bytes_read = read(fd, buffer, sizeof(buffer));
    if (bytes_read == -1) {
    
    
        perror("读数据失败 \n");
        close(fd);
        return 1;
    }

    buffer[bytes_read] = '\0';
    printf("读取到的数据: %s\n", buffer);
    printf("######## #### #### #### ####  \n");

    printf("######## #### #### #### ####  \n");

    printf("正在写数据:\n");
    const char *data_to_send = "power_off";
    ssize_t bytes_written = write(fd, data_to_send, strlen(data_to_send));
    if (bytes_written == -1) {
    
    
        perror("写数据失败 \n");
    } else {
    
    
        printf("写数据: %s \n", data_to_send);
    }

    close(fd);
    printf("######## #### #### #### ####  \n");

    return 0;
}

===== Entonces puedes interactuar =====

root@xxx:/mnt/appslog# 
root@xxxx:/mnt/appslog# ./my_app 
######## #### #### #### ####  

正在读数据:
读取到的数据: Hello from Kernel!

######## #### #### #### ####  
######## #### #### #### ####  87.297512] [zh] recv from User user_data: power_off
[   87.316995] [zh] recv from User count: 9
据:
[   87.321409] sunxi_i2s_preapre,SNDRV_PCM_STATE_XRUN:playback xrun.
[   87.321409] [zh] 关机 
[   87.332323] [axp] off zhenghui ############!

Supongo que te gusta

Origin blog.csdn.net/qq_17623363/article/details/133088629
Recomendado
Clasificación