Padauk是一家台湾超低成本微控制器供应商,以“3分钱MCU”而闻名。供应商本身仅提供具有专有C风格语言的封闭工具链。与此同时,部分基于逆向工程的开源且独立创建的工具链已经可用。
仍有一些领域尚未完全了解。其中一个主题是I/O寄存器的初始状态。真实设备的行为与数据表有些不一致,这可能是由于勘误表或专有和开放工具链的不同行为造成的。
为了详细研究PadaukPFS173-S16上的这种行为,我们使用了一个小程序在启动后直接将整个I/O空间复制到RAM。由于不可能对I/O寄存器进行索引访问,因此必须生成单独的指令来复制每个地址。
MCU外设正确初始化后,I/O区域备份将通过串行端口转储。
上图显示了复位后整个I/O区域的转储。有128个可能的寄存器,但只有其中一些被使用和记录-只有少数寄存器实际上显示非零值。
一个有趣的方面是某些值是重复的,例如地址00和01中的0xF0。这一点特别引人注目,因为0x01处的寄存器实际上未使用。更多的实验表明,实际上最后访问寄存器的内容是重复的。该行为看起来非常像浮动内部总线-如果访问的寄存器不存在,则不会将新信息写入总线;由于寄生电容,上次访问的逻辑电平被存储。当然,如果这是一个安全关键设备,这将是一个很好的侧通道。但我们仍然可以利用这种效应来识别哪些I/O寻址被实际利用,哪些未被利用。
为了探测未使用的寄存器,我只是在I/O读取之前直接将0x55写入已知寄存器。如果下一次读取访问是针对未使用的I/O位置,则它将读取为0x55并且可以轻松识别。正如您在上图中看到的,许多I/O地址现在读取的是0x55,因此未使用或只可写入。大多数使用的寄存器都可以轻松地与文档进行交叉检查。
然而,有一些寄存器无法分配。第一个,在0x23处标记为红色,另一组在0x2d、0x2e、02f处标记为绿色。进一步探测发现0x2d显然是一个控制寄存器。复位状态为0xE0。位7-5、3、1、2为R/W,位4和2为RO或WO。0x2e和0x2f似乎是只读的。
JS在EVBlog-Forum中的一些出色的调查揭示了对绿色寄存器的一个非常有趣的解释:似乎早期的padauk微控制器包含一个称为电阻频率转换器(RFC)的外设,仍然可以在旧数据表版本中找到它经销商。这些寄存器的位配置与结果完全一致,因此匹配的可能性很大。
目前尚不清楚为什么该外围设备没有记录。Padauk的目录中仍然提到了它,但没有列出具有此功能集的任何设备。
未记录的寄存器0x23(红色)的用途很容易识别:它实际上包含ADC的附加LSB。Padauk似乎有一个用于11位ADC的标准IP模块,该模块也用于PFS173。由于某种原因,它被声明为8位ADC,而低三位未记录。可能存在噪音问题?