当前位置: 代码迷 >> 综合 >> u-boot启动logo ramdisk 关机充电。。。。
  详细解决方案

u-boot启动logo ramdisk 关机充电。。。。

热度:48   发布时间:2023-12-16 12:24:44.0

起源是做了个u-boot的cmd,执行就好了,先getenv()环境变量,获取bmp图片的内存地址,然后读取内存内容,判断是不是bmp文件,判断是不是8位 。。。
最后一切成功,向framebuff里写数据,来显示。

这个命令要记住
jpegtopnm $1 | ppmquant 31 | ppmtobmp -bpp 8 > $2

会让你的图片不报错的 具体要求看代码

参考链接https://blog.csdn.net/yin_pengpeng/article/details/49178659

cmos里bootfs就是ramdisk, root=/dev/ram0
linux中RamDisk的三种实现方式
https://blog.csdn.net/alextanghao/article/details/2660656

bootfs:
https://blog.csdn.net/Huangxiang6/article/details/84749469
以下代码就是cmos里bootfs(ramdisk)中 init脚本部分
他的本质就是判断bootloader传进来的参数,判断现在是不是充电状态,然后挂载不同的rootfs

boot_syber_recovery() {
    echo 0 > /sys/class/android_usb/android0/enableecho ffs > /sys/class/android_usb/android0/functionsecho 1 > /sys/class/android_usb/android0/enable/bin/mkdir -p /dev/usb-ffs/adb/bin/mount -t functionfs adb /dev/usb-ffs/adb/bin/mkdir /dev/pts/bin/mount -t devpts none /dev/pts/bin/mkdir -p /system/bin/bin/ln -s /bin/sh /system/bin/./bin/adbd_syber&exec /bin/init
}boot_syber() {
    /bin/mkdir -p /mnt/rootfs/bin/mount -t ext4 /dev/mmcblk0p$ROOTFSNO /mnt/rootfsexec /sbin/switch_root /mnt/rootfs /sbin/initecho 0 > /sys/class/android_usb/android0/enableecho ffs > /sys/class/android_usb/android0/functionsecho 1 > /sys/class/android_usb/android0/enable/bin/mkdir -p /dev/usb-ffs/adb/bin/mount -t functionfs adb /dev/usb-ffs/adb/bin/mkdir /dev/pts/bin/mount -t devpts none /dev/pts/bin/mkdir -p /system/bin/bin/ln -s /bin/sh /system/bin/./bin/adbd_syber&exec /bin/init
}bootfs_init
BOOTMODE=`/usr/bin/awk -F "boot_mode=" '{print $2}' /proc/cmdline | /usr/bin/awk -F " " '{print $1}'`
/bin/echo "SyberOS boot_mode="$BOOTMODE
case $BOOTMODE in
syberos)/bin/echo "Start syberos mode ..."addpart_bynameif [ $? -ne 0 ]; thenbreakfiboot_syber;;
syberos-recovery)/bin/echo "Start syberos recovery mode ..."addpart_bynameif [ $? -ne 0 ]; thenbreakfiboot_syber_recovery;;
*)/bin/echo "Unknown boot mode !!!"addpart_bynameif [ $? -ne 0 ]; thenbreakfiboot_syber
esac/bin/echo "System Error, Need Reboot ......"
bootfs_loop

关机充电

u-boot中也实现了关机充电的部分
首先,在detect文件中读取寄存器的值,判断是否是进入了关机充电状态,如果是,将会初始化lcd,backlight,显示出logo。此时 在cmd_cboot.c中判断是否是 is_bat_low() 如果电量低就充电, 然后循环判断电池电量。 没什么问题,就直接进入charger模式,设置标志位,设置boot_cmd (给cmdline,以后ramdisk要用)然后继续logo,lcd。。。。

至于到底是什么状态,u-boot会去读寄存器轮询,在do_cboo函数中,实现相关操作
类似,但和元心不太一样的操作
https://blog.csdn.net/xubin341719/article/details/8498580

关机充电整体流程介绍:
https://blog.csdn.net/tigertang2/article/details/23169203
healthd代码分析:
https://www.cnblogs.com/liulaolaiu/p/11744549.html
healthd 显示充电图片部分分析
https://blog.csdn.net/zhuyong006/article/details/87935708
healthd电量百分比显示 && 充电显示图片替换
https://blog.csdn.net/yy782101688/article/details/102852180

u-boot:

u-BOOT,关于charger模式的检查
int do_cboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
    volatile int i;boot_mode_enum_type bootmode = CMD_UNDEFINED_MODE;CBOOT_MODE_ENTRY boot_mode_array[21] ={
    0};if(argc > 2)return CMD_RET_USAGE;
#ifdef CONFIG_AUTOLOAD_MODEautoload_mode();
#endif
#if defined CONFIG_AUTOBOOTif (reboot_mode_check() == CMD_AUTODLOADER_REBOOT){
    autodloader_mode();}else    {
    #if defined CONFIG_X86write_sysdump_before_boot_extend();//if autoboot kernel is crash and reboot,the uboot go to sysdump in x86;#endifnormal_mode();}
#endif
#if defined CONFIG_ZEBU || defined CONFIG_FPGAnormal_mode();
#endifboot_pwr_check();if (2 == argc) {
    /*argument has the highest priority to determine the boot mode*/bootmode = get_mode_from_arg(argv[1]);} else {
    //在这里轮询,判断是手边现在是什么模式:for (i = 0;  i < CHECK_BOOTMODE_FUN_NUM; i++) {
    if (0 == s_boot_func_array[i]) {
    bootmode = CMD_POWER_DOWN_DEVICE;break;}bootmode = s_boot_func_array[i]();if (CMD_UNDEFINED_MODE == bootmode) {
    continue;} else {
    debugf("get boot mode in boot func array[%d]\n",i);break;}}}board_boot_mode_regist(boot_mode_array);
这个数组,记录有08个模式,从08依次读寄存器轮询 ,charger在第6个,轮循到某个模式,读取寄存器如果符合条件,就返回。如果这么多模式都不进,那么返回第九个0,返回0其实就是进nomal模式,正常开机
CBOOT_FUNC s_boot_func_array[CHECK_BOOTMODE_FUN_NUM] = {
    get_mode_from_bat_low,write_sysdump_before_boot_extend,/* 1 get mode from file*/get_mode_from_file_extend,/* 2 get mode from watch dog*/get_mode_from_watchdog,/*3 get mode from alarm register*/get_mode_from_alarm_register,/*0 get mode from calibration detect*/get_mode_from_pctool,/*4 get mode from charger*/get_mode_from_charger,/*5 get mode from keypad*/get_mode_from_keypad,/*6 get mode from gpio*/get_mode_from_gpio_extend,/*shutdown device*///get_mode_from_shutdown,0
};
如果连着充电器,就返回charger模式。进入charger。不连接,就返回undefined,继续向下一个模式轮询
boot_mode_enum_type  get_mode_from_charger(void)
{
    if (charger_connected()) {
    debugf("get mode from charger\n");return CMD_CHARGE_MODE;} else {
    return CMD_UNDEFINED_MODE;}
}

healthd:

其中关机部分代码:
if (code == KEY_POWER) {
    //如果是POWER键,并且是按下事件,则判断是否是长按,//长按则重启android正常进入系统,否则设置下次检测按键的时间, wait_next_event()会//用到if (key->down) {
    int64_t reboot_timeout = key->timestamp + POWER_ON_KEY_TIME;if (now >= reboot_timeout) {
    int fd = open("/sys/devices/platform/asoc_spi.1/spi_master/spi1/spi1.0/set_charger_status", O_RDWR);write(fd, "0x1", strlen("0x1"));close(fd);LOGI("[%lld] rebooting\n", now);android_reboot(ANDROID_RB_RESTART, 0, 0);} else {
    /* if the key is pressed but timeout hasn't expired,* make sure we wake up at the right-ish time to check*/set_next_key_check(charger, key, POWER_ON_KEY_TIME);//按了power键,但时间没够,也显示充电动画kick_animation(charger->batt_anim); }//如果产生的不是POWER按键的事件,则显示充电动画} else {
    /* if the power key got released, force screen state cycle */if (key->pending) {
    request_suspend(false);kick_animation(charger->batt_anim);}}
}

今日份:bootfs的etc里有分区表,根据分区表排号,在ramdisk中进行挂载,
还有就是今天学到的 rootfs,文件直接 可以mount(以前竟然不知道) 以后直接 mount rootfs_name tmp/ ,直接进tmp里看rootfs ×××××××××××

  相关解决方案