我们想知道如何在内核级驱动程序中读取 AM335x 上的复位原因。 (我们可以在 uboot 中读取它、但要在 Linux 驱动程序中执行它)
我感到惊讶 的是、经过7年以上的驱动程序不支持后、这一问题仍未解决。
通过关注其他帖子、我认为我已经添加了我需要的函数、但是在 OMAP-WDT.c 文件中、当它检查"read_reset_sources"函数是否存在时、它会跳过它、因为我认为它是空的、或者"pdata"可能是空的。
我添加了一些用于调试的 pr_err 行、但从未转到"OMAP 看门狗复位值"行:
OMAP-WDT.c
PR_ERR ("OMAP 看门狗在复位检查前在此输入");
if (pdata && pdata->read_reset_sources){
u32 rs = pdata->read_reset_sources();
PR_ERR ("OMAP 看门狗复位值:0x%08X\n"、RS);
IF (RS 和(1 << OMAP-MPU_WD_RST_SRC_ID_SHIFT)
wdev->wdog.bootstatus = WDIOF_CARDRESET;
}
在 prm33xx.c 中、我添加 了 am33xx_PRM_READ_RESET_Sources 函数、并且还基于 AM335x TRM 创建了 PRM_RESET_src_MAP 结构。
然后、我将该函数链接到 PRM_LL_DATA 结构中。
(我添加了 AM33XX... 寄存器头文件中的移位位)
prm33xx.c
/* AM335x 复位映射*
静态结构 PRM_RESET_SRC_MAP omap33xx_PRM_RESET_SRC_MAP[]={
{AM33XX_GLOBAL_RST_SHIFT、OMAP_GLOBAL_COLOW_RST_SRC_ID_SHIFT}、
{AM33XX_GLOBAL_SW_RST_SHIFT、OMAP_GLOBAL_WARM_RST_SRC_ID_SHIFT}、
{AM33XX_MPU_WD_RST_SHIFT、OMAP_MPU_WD_RST_SRC_ID_SHIFT}、
{AM33XX_EXTERNAL_WARM_RST_SHIFT、OMAP_EXTWARM_RST_SRC_ID_SHIFT}、
{AM33XX_ICEPICK_RST_SHIFT、OMAP_ICEPICK_RST_SRC_ID_SHIFT}、
{-1、-1}、
};
(笑声)
/**
* am33xx_prm_read_reset_sources -返回最后一个 SoC 复位源
*
*返回一个 u32、表示 SoC 的最后一个复位源。 。
*返回的复位源位在 OMAP SoC 之间实现了标准化。
*
静态 u32 am33xx_prm_read_reset_sources (void)
{
struct prm_reset_src_map *p;
u32 r = 0;
u32 v;
v = am33xx_prm_read_reg (AM33XX_prm_device_MOD、AM33XX_prm_RSTST_offset);
p = omap33xx_prm_reset_src_map;
while (p->reg_shift >= 0 && p->std_shift >= 0){
if (v &(1 << p->reg_shift))
r |= 1 << p->std_shift;
P++;
}
PR_ERR ("powerdomain:复位源寄存器:0x%08X\n"、r);
返回 r;
}
(笑声)
静态结构 PRM_LL_DATA am33xx_PRM_LL_DATA ={
read_reset_sources = am33xx_prm_read_reset_sources、
.assert_hardreset = am33xx_prm_assert_hardreset、
.deassert_hardreset = am33xx_prm_deassert_hardreset、
.in_hardreset_asserted = am33xx_prm_s_s_hardreset_assert_dasserted、
.reset_system = am33xx_prm_global_warm sw_reset、
};
为了使 OMAP-WDT 能够识别驱动程序确实支持 READ_RESET_Sources 函数、我还需要做什么?