微型Macintosh Plus

图片

在家用计算机的早期,有一家名为Apple的公司。 她刚刚在Apple II系列计算机上取得了长足的进步,但她需要创新才能保持在快速发展的计算机市场上的领先地位。 该公司已经在Lisa系列产品上工作,该产品受到微型计算机的启发,是为商业用户设计的,这意味着它的价格合理,但对于普通消费者而言,它似乎太昂贵了。 作为一个额外的项目,Macintosh被开发出来,它被认为是实现了“街上的人们”的新一代计算机的构想,成本约为500美元。 该项目由史蒂夫·乔布斯(Steve Jobs)接手,在他的领导下,硬件变得更加先进,软件接收了GUI而不是文本界面,价格飙升至近2500美元。 例如,虽然以这种价格获得的设备有些令人失望,但它缺乏其他计算机的图形加速器和声音功能,但该软件证明价格合理。 第一台Macintosh是Mac 128K,它的成功促使人们创建了这种紧凑型Mac的更高级型号,尤其是Macintosh 512K,Macintosh Plus和Macintosh SE系列。

尽管Macintosh的开发发生在1984年左右,即在我开始了解计算机之前很久,但我对紧凑型Macintosh还是有一些缺点:我父母买的第一台计算机是Macintosh Plus。 后来补充了20 MB SCSI硬盘驱动器,并在这台计算机上编写了我的第一个Basic程序。 当我仍在荷兰居住时,我购买了一台损坏的SE / 30机器, 并将其转变为Linux服务器,该服务器仍然能够运行Mac软件。 但是,我把这辆车留在了荷兰,在这里,在上海,我不再拥有经典的Apple硬件。

尽管很明显我已经不再需要Mac Plus,但我还是喜欢随身携带以防怀旧攻击的想法。 如果我自己创建此类计算机的小型副本,也许可以从Macintosh中获得一小部分经验。 如果我已经具有创建较小版本的旧硬件的经验,那么为什么不尝试应用此过程来构建古老的Mac Plus?

展示架


我应该用什么来建造这样的机器? 最初,我想到了采用Raspberry Pi或类似设备的想法,添加一个2.5英寸的LCD屏幕,一个PCE或MiniVMac之类的模拟器,在3D打印机上打印外壳并考虑完成的工作。 但是我认为这个想法不会奏效:按照我的口味的机器不仅太大,而且项目本身太简单。 在最初的Mac 128K中,即使最终结果功率太低,开发人员还是设法节省了一些技巧。 简单组装标准“铁”的复制品与原始设计的精神背道而驰。 所以我去淘宝买了更多异国情调的食材!


我决定从显示器开始。 Mac当时具有高分辨率的屏幕,因此选择合适的显示器非常重要。 通常,在中国电子市场中选择显示器时,种类繁多。 不幸的是,“大分类”由高分辨率的屏幕组成,但也由大尺寸的屏幕组成,或者由小分辨率的小屏幕组成。 理想情况下,我需要512x342像素的分辨率; 这是Mac的本机分辨率,在类似的显示屏上,我无需缩放即可显示所有内容。 不幸的是,市场上没有这样分辨率的现成屏幕。 最接近的模拟将是640x480。 由于某种原因,这种分辨率的屏幕相当大:最小的屏幕对角线为3.5英寸。 因此,a,如果我想使Mac尽可能小,则必须降低分辨率。

决定有可能稍微降低分辨率之后,我得到了各种各样的显示器。 最早见到的显示器之一是x163qln01-友达光电生产的1.63英寸OLED屏幕。 它有点贵(每个屏幕约25美元),但通常可以在淘宝上找到,并且数据表至少记录了触点,尺寸和电源要求。 似乎该显示器是为Android上的某种智能手表品牌设计的,还有一个Google,我什至发现了可以使用的一些初始化序列。

唯一的问题(连接器的触点彼此之间的距离为0.5 mm除外)是显示器不使用并行接口,不是使用SPI,而是使用MIPI接口。 我稍后将不得不处理。

选择显示后,您可以转到处理器。 我选择了ESP32-Wrover模块。 该模块包含一个ESP32(一个WiFi芯片,带有两个以240 MHz运行的32位CPU和大约一半的RAM),4个MiB闪存和4个MiB PSRAM。 我建议两个CPU内核的速度应足以模拟Mac,并且我可以使用4 MiB的PSRAM作为Mac RAM。 尽管4 MiB的闪存不是很多,但对于仿真器以及带有系统软件和程序的小型硬盘来说,它们应该足够了。 我也从在Espressif的工作中受益,所以这台设备我很熟悉。 此外,我可以从工作中提取一些模块,而不必购买它们并等待交付。

因此,一切准备就绪,一切就绪-OLED屏幕仍然需要电源组件,因此低压降稳定器(LDO)和其他电源芯片增加了组件数量。 对于Mac,还需要声音,因此我购买了便宜的加速器芯片和扬声器,并获得了用于电源和调试的标准FT232模块。 所有这些组件都非常小,可以减少设备的体积。 结果应该是一个比实际Mac稍大1/6的模型。

显示控制


尽管我不能抱怨显示器的分辨率,大小和亮度,但事实证明在显示器上显示像素更加困难。 ESP32芯片不支持MIPI,因此我需要寻找另一种通信方式。 MIPI DSI是由MIPI Alliance开发的标准,并且不开放; 由于这是我的爱好,因此我不得不从泄露的文档中收集一些信息并测试现有设备。 幸运的是,在一两年前, 迈克·哈里森Mike Harrison)对MIPI DSI接口进行了反向工程,该接口用于控制iPod显示屏( 1、2、3、4、5网站 ),并且还找到了该规范的多个副本。 它使我的生活变得更加轻松:至少它可以帮助我弄清楚要发送到显示器的内容。

尽管界面还有很多(要了解这一点,您应该观看我上面链接的所有视频),但是物理MIPI层很容易解释。 MIPI使用四根导线:两条数据总线和两条时钟总线。 它还具有两种信号传输模式:低功耗(LP)模式和高速(HS)模式。


在低功耗模式下,电线分别用于传输控制数据结构,以及表示某些命令直接对物理接收器产生直接影响。 与高速模式相比,此模式下的电压降非常大:对于高信号,电压约为1.2 V,对于低信号,电压约为0V。由于低功率模式具有更多信号状态,因此它执行诸如发送等功能订单的接收者切换到高速模式或退出它。 在上图中,蓝线表示低功耗模式下的数据传输。

在高速模式下,两条时钟总线(CLKP / CLKN)和两条数据总线(DP / DN)用作差分总线:一条总线始终与另一条总线相对。 接收器检测两条总线之间的差异,并基于它们设置传输的值:如果DP大于1,则设置为1;如果DN大于2,则设置为0。 顾名思义,高速模式提供了非常快的数据传输,时钟频率高达1.5 GHz。 为了实现此目的而又不产生过多的电磁干扰和功耗,该标准使用以下技巧:使用非常低的电压:线对上的电压平均为200 mV,每条母线的偏差为±100 mV,以指示零和一。 在上图中,红色位以高速模式传输。

从以高速模式传输数据本身的角度来看,该接口本质上可以看作是一个相当奇怪和差分的SPI接口:存在一个时钟信号和一个数据传输通道,并且在每个时钟周期将数据值传输到该接口。 与SPI的区别(除了信号是差分的)是,仅当CLK总线的状态改变时才发送数据位,而不仅是在上升沿时才发送。 另一个区别是,当/ CS总线上的信号变低时,无法识别出传输的开始,而是带内信号:每次数据传输均以一个唯一的“魔术字”开始,接收器确定该值以了解何时开始传输。

为了确保此接口与ESP32交互,我将必须执行一个电平转换。 我想从3.0 V电源为ESP32供电,以便所有GPIO也具有3.0或0V。为了使其适应MIPI接口的信号电平,我选择了最便宜的解决方案:我只使用了电阻分压器网络。

为了计算电阻值,我为我感兴趣的三个输出电压状态创建了方程式(高低功率信号为1.1 V,低高速信号为0.07 V,高速信号为0.33 V;选择电压为因此在大多数情况下它们仍处于规格范围内)以及应生成它们的三个输入状态。 我得到了方程式。 从理论上讲,可以手动解决它们,但最后我将其放弃在WolframAlpha中,并获得了所需的电阻值。

            3v
 G -R1-+ R3
 G -R2-+-+ ---->
            R4
           地线

 R4 *(1.9 / R1 + 1.9 / R3)= 1.1, 
 (1 /(1 / R4 +1 / R1 +1 / R2))*(2.93 / R3)= 0.07, 
 (1 /(1 / R4 +1 / R1))* 2.67 *(1 / R3 +1 / R2)= 0.33, 
 R2 = 1000

 R1 = 280,R2 = 1K,R3 = 3K6,R4 = 150 


在这一点上,我意识到您也可以作弊:由于在高速模式下总线是差分的,因此显示器只会查看两条总线之间的差异来确定传输的数据。 这意味着我可以通过在其中一条总线上保持固定电压并对另一条总线施加高电平或低电平信号来节省GPIO。 为此,我需要第二种电阻网络:

            3v
            R3
 G -R1-+-+ ---->
            R4
           地线

 R4 *(1.9 / R1 + 1.9 / R3)= 1.1,
 (1 /(1 / R4 +1 / R1))*(2.8 / R3)= 0.2,
 R4 = 150

 R1 = 320,R3 = 1500,R4 = 150 


另一个任务是创建一个时钟电路。 普通SPI在时钟总线的前沿发送一个位。 (或在后沿,取决于配置。)MIPI在时钟信号的前沿和后沿都发送一个比特。 尽管ESP32设备的SPI模块本身无法生成此类信号,但我们可以使用简单的D触发器将其相互转换,该D触发器的反相输出连接至输入。 根据需要,输入端的每个时钟脉冲都会改变输出电平。

电路图


处理完显示设备后,我们结束了最困难的部分。 现在,我们要做的就是添加其余的内容。 让我们从电源开始。 这很简单:我从USB到串行转换器为整个5V电路供电,该转换器也可以用作调试/编程接口。 该电压用于产生OLED屏幕所需的+4.6 V,-3.4 V和1.8 V,以及3.0 V为ESP32供电。 TPS65631芯片产生+4.6 V和-3.4 V的电压,其参考电路显示在OLED显示器的数据表中。 其他电压由一对简单的LDO产生。


Macintosh也有声音。 按照现代标准,它的质量不是很高(22 kHz,8位),但是它的程序声音现在很传奇,所以在我的项目中我不能拒绝它们。 ESP32具有内置的8位DAC,用于创建仿真器生成的模拟声波。 然后将它们馈送到NS8002,这是2瓦AB级声音放大器,以小型SOIC8格式安装。 它价格便宜,需要很少的支持组件,并且产生的声音足以吸引人们注意微型Mac。


使Macintosh如此具有革命性的方面之一是,它是第一批带有鼠标的商用计算机之一。 Macintosh团队非常仔细地考虑了鼠标,以至于几乎整个操作系统都是基于鼠标控制的UI元素,与IBM PC不同,整个Macintosh可以由鼠标控制。 显然,我的小型Mac也需要此重要的外围设备。 我仍然记得第一台Macintosh电脑上出售的球形鼠标,但是我对经常清洁滚轮上的灰尘感到不满意。 正是由于这个原因,这些机械设备已完全被光学鼠标取代。 这样做的好处是,这些新型光电鼠标的详细信息非常容易找到:例如,很快我就找到了ADNS9500游戏鼠标传感器和相应光学器件的卖方。

另一个方便的方面是,光学鼠标传感器是一种深度集成的设备:它只需要几个外部组件即可工作,这在图中得到了体现。 增加了几个电容器来稳定电压,并增加了一个MOS晶体管(直接从数据表中复制)以打开激光二极管和其他标准细节。 鼠标传感器通过四线SPI信号传输数据,我使用其中的一根线发送鼠标按钮信号:当我单击按钮时,MISO触点被拉低了很多。 该上拉电阻的值不足以使鼠标停止传输数据,但足以克服通常会上拉总线的上拉电阻,因此当传感器在MISO总线中创建三种状态时,ESP32可以识别按钮按下。


最后,您需要连接OLED屏幕。 我们已经完成了计算所有电阻器值的所有艰巨工作,因此电路应或多或少地说明自己。 添加的芯片是D触发器,用于使时钟速度减半:如上所述,每次时钟信号的极性反转时,MIPI标准都需要一个新位,而ESP32仅在正面或背面传输一个新位。前。


绘制示意图后,我继续创建电路板设计。 我选择的显示器将安装在对其进行控制的板上,并且连接器应位于该电路板的背面。 尽管这不会为其他组件留下太多空间,但我仍然想将所有其他组件放在另一侧。


拥有良好的视野和热风枪真是太好了:这使我可以使用0603组件,并将所有组件放置在电路板上的有限空间内。 用传统的烙铁将显示连接器和OLED QFN电源芯片连接起来特别困难。


我意识到鼠标传感器及其组件会占用板上太多的空间,因此我决定将所有组件焊接到传感器本身。 因此,一切都可以放在鼠标中。



软体类



显然,软件是该程序集中的一个非常重要的元素:您必须模拟整个Macintosh。 但是,Macintosh并非如此复杂的机器。 实际上,它包含一个68000微控制器,一个控制串行端口的Zilog Z8530串行传输控制器,用于内部I / O和用于提供与键盘的接口的6522 VIA以及几个包含用于显示和声音的逻辑的可编程逻辑阵列(PAL)。 它还具有集成的Woz Machine芯片,该芯片提供了与软盘驱动器的接口。 这是一个非常复杂的芯片。 但是,我不打算模拟软盘,因此足以模拟IWM,并不断返回驱动器中没有磁盘。 相反,我计划完全模拟连接到模拟SCSI硬盘驱动器的NCR 5380 SCSI芯片,该芯片将从ESP32-Wrover内置闪存中读取。

此外,该系统将只有很少的程序可以直接访问设备:Mac程序员从一开始就被告知要使用OS级硬件抽象层来保持与Mac设备的未来版本的兼容性。 通常,这意味着,如果我能够在某种程度上模拟硬件,以使OS能够启动并且对所有操作都满意,那么大多数程序都可以正常工作。

因此,我决定您可以尝试从头开始编写模拟器。 更确切地说,不是完全从零开始。 68000是一只相当复杂的野兽,我不想重新发明轮子。 取而代之的是,我在互联网上搜索后发现, MAME具有一个方便快捷的基于CK的68K仿真器,称为Musashi,非常适合我的需求。 , -, ESP32 .

ESP32: OpenOCD, , «---» . Linux, ESP32. , datasheet , Linux-68K , Inside Macintosh, . , , .

, C gcc libsdl , . , - , MacPlus: , , SCSI :


«» , devboard ESP-Wrover-Kit. , Wrover, , 320x240, .


Mac ; 7,8 , Mac Plus. (7,8 , Mac Plus; , 35%.)

, devboard — , , , devboard. : devkit 320x240 Mac. , , 320x320, : Mac 512x342?

512x342 320x320, . , , , , . , , - , , . . OLED-.

但是怎么做呢? OLED- . , ; OLED- . , : «» , . , . :


, — ; . , 480 x 640 . 512x342 , , , 1,63- , GUI, 9- :




, , Macintosh Plus, , . ? , !

3D- Formlabs 1+ SLA . . . , Macintosh Plus. , … , : - Mac 128K ( , Plus) wiki iFixit .

- 3D- OpenScad, , . Mac 1:6.


iFixit, , 1/6 . 2/5, Mac, .


, , — . STL Formlabs 1+. ; , . .

图片


结果


, . . usb-to-serial, , . - , . . (, … , .)


, , , , 3D- , . , , Mac, , , . Mac !



, , Mac. . 20 , , — : Mac Plus , .


, Mac Plus? , , . , : AppleTalk WiFi, - , Mac. , , - Mac After Dark:


, open-source, , Github . Beer-Ware license, , . - - , .

Source: https://habr.com/ru/post/zh-CN444574/


All Articles