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

起源是做了个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/enable
	echo ffs > /sys/class/android_usb/android0/functions
	echo 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/rootfs
	exec /sbin/switch_root /mnt/rootfs /sbin/init

	echo 0 > /sys/class/android_usb/android0/enable
	echo ffs > /sys/class/android_usb/android0/functions
	echo 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_byname
	if [ $? -ne 0 ]; then
		break
	fi

	boot_syber
	;;
syberos-recovery)
	/bin/echo "Start syberos recovery mode ..."
	addpart_byname
	if [ $? -ne 0 ]; then
		break
	fi

	boot_syber_recovery
	;;
*)
	/bin/echo "Unknown boot mode !!!"
	addpart_byname
	if [ $? -ne 0 ]; then
		break
	fi

	boot_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_MODE
        autoload_mode();
#endif
#if defined CONFIG_AUTOBOOT
        if (reboot_mode_check() == CMD_AUTODLOADER_REBOOT)
        {
                autodloader_mode();
        }
        else    {
        #if defined CONFIG_X86
                write_sysdump_before_boot_extend();//if autoboot kernel is crash and reboot,the uboot go to sysdump in x86;
        #endif
                normal_mode();
        }
#endif
#if defined CONFIG_ZEBU || defined CONFIG_FPGA
        normal_mode();
#endif
        boot_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 ×××××××××××

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_kerneler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值