\documentclass[a4paper]{article} \usepackage[utf-8]{inputenc} \usepackage[german]{babel} \usepackage{url} \usepackage{alltt} \usepackage{multicol} \title{Reverse–Engineering–Preventer mit DS2401} \ifx\shorttitle\undefined\else \shorttitle{Reverse–Engineering–Preventer} \fi \author{Wolfgang Allinger} \begin{document} \maketitle Ein \emph{Reverse--Engineering--Preventer} mit DS2401 und Dallas--One--Wire--Worten für den 8031 \begin{multicols}{2} \section{Übersicht} Das Dallas--One--Wire--Protokoll (DOW) wird hier benutzt, um eine eindeutige Seriennummer aus dem DS2401 zu lesen. Es gibt weitere DOW--Bausteine, u.~a.\ für Temperaturmessung, I/O--Signale, RAM, Uhr, ADC und DAC \ldots \section{Warum die Mühe?} In diesem Fall sollten Kopien der Applikation verhindert werden. Den DS2401 gibt es in einem TO92--Gehäuse, und er sieht dann wie ein normaler Transistor (EBC) aus. Aber nur die zwei Anschlüsse \emph{Basis} und \emph{Emitter} sind aktiv, der \emph{Kollektor} ist n/c (so eine Art Holzbein :-). Wenn man die \emph{Basis} an einen bidirektionalen 8031--Port--Pin, den \emph{Emitter} an GND und den \emph{Kollektor} an irgendeinen anderen Pin verdrahtet, kann man die meisten Hacker schön zum Narren halten. Entsprechende Abfragen beim Start mit viel Dummy \texttt{ROT PICK TUCK SWAP DROP TUCK} n \texttt{ROLL}, \texttt{M/MOD} (Plutimikation ;-) \ldots garniert, irgendwo dabei tiefer im Stack die Nummer über n \texttt{PICK} abfragen und dann nach Start der Anwendung und einer Zufallszeit gegen eine codierte Kopie im EPROM vergleichen, und dann lapidar mit \glqq EEPROM--Datenfehler\grqq--Meldung anhalten. Hat prima funktioniert, zumal ich die Beschriftung vom DS2401 abgeschliffen habe und der in der Stückliste und im Schaltplan als NPN--Transistor aufgeführt worden war. Ich bin nicht böse, nur der Umgang mit \emph{Geiz--ist--geil--Kunden} hat mich das erfolgreich gelehrt. Man musste allerdings zum 1.\ Start noch eine Routine ins RAM kompilieren, die dann die aktuelle Nummer im Target auslas und in das Image für das EPROM schrieb. Das geht heutzutage mit geflashten Programmen leichter. \section{DOW--Bus--Prinzip} Der DOW--Bus ist als Open--Collector--Leitung zu sehen, die von einem Pullup hochgezogen wird. Alle Teilnehmer sind an dieser einzigen (neben GND) Leitung angeschlossen. Die Teilnehmer werden durch High--Pulse und einen damit geladenen internen Kondensator gespeist. Nach einem High--Puls vom DOW--Master zieht der aktivierte Slave für eine gewisse Zeit den Bus auf Masse oder auch nicht. Je nachdem wird die Antwort als 0 oder 1 interpretiert. Ein 8031--Port im bidirektionalen Mode ist ideal als BUS--Master. Man braucht keinen externen Pullup--Widerstand, da der 8031 einen weak--pullup (ca.\ 20k$\Omega$) hat, der beim Wechsel von L nach H für nur 2 Taktzyklen niederohmig kräftig nach High gezogen wird. Den dann folgenden schlappen High--Pegel können die Slaves dann leicht herunterziehen. Der DS2401 schickt seine Seriennummer, die eindeutig (unique) ist, als 8 Byte einschließlich einer CRC8 zurück. In dieser Applikation schicke ich immer entweder das \texttt{RD}--Kommando (33h) oder eine Dummy--Date (FFh) zum Bus, aus dem unteren Bit heraus, und kopiere dann die Antwort ins untere Bit zurück, und rotiere das solange, bis alle 8 Bit ausgetauscht sind. Also ein spezielles Software--UART. Beim 8031 kann man sehr geschickt das CY-Bit (carry) auch komplementär mit einem Portpin verwursten, was ich auch ausnutze. Der 8031 hat neben der normalen 8--Bit--ALU (arithmetic logic unit = Recheneinheit) noch eine 1-Bit--ALU, das ist das CY-Bit. Das genaue Zeitverhalten und die sonstigen Eigenheiten dieses DOW bitte im Dallas--Handbuch nachlesen. Das einzige Übel dabei ist, dass Dallas vor einiger Zeit von Maxim geschluckt wurde. \section{Anmerkung} Der nachfolgend wiedergegebene Code ist aus einer Anwendung von 1995 herauskopiert und editiert worden. Ich hab alles Spezielle dieser Anwendung weggelassen, habe es aber nicht getestet. So ist es einfach eine Info, aber ich hoffe, dass diese Info nützlich ist. Die Applikation wurde ursprünglich für den LMI--Forth--Metacompiler geschrieben, aber ich habe die Quell--Screens bzw.\ Blocks umeditiert in eine Datei. Der Bericht von Bernd Paysan: \emph{Dallas 1--Wire mit Forth ansprechen} aus der VD 1/2008 hat mich angeregt, meine sehr hardwarenahe Sicht darzulegen. Ich brauchte etwa 40 Zeilen für den eigentlichen 1--Wire--Code. Der Rest ist Anwendung und Kommentar. NOTAM: Die Timing--Schleifen laufen alle für einen alten 8031 mit 12MHz Clock. Mit modernen, optimierten und sehr schnellen 8031--Derivaten geht das natürlich nicht so einfach :-) \hfill Villa Elisa, Paraguay all2001@gmx.de ALL20080416 (c) 1995, 2008 by Wolfgang Allinger c/o Ingenieurbuero Allinger Villa Elisa, Paraguay. \\ mailto: all2001@gmx.de\\ Das Programm darf frei benutzt werden, solange damit kein Geld verdient wird UND mein (c) Eintrag erhalten bleibt. Falls jemand es kommerziell nutzen möchte, dann bitte wg.\ Genehmigung anfragen. 123h ist hexadezimal, 456.\ ist dezimal \# in Kommentaren \end{multicols} \section{Quellen} DOW31d.txt editiert und übersetzt aus: \texttt{ALL20080416 DOW31.SCR} Dallas One Wire words 8031 \texttt{ALL 10:08 12JAN95 Last changed screen \# 010 ALL 21:21 14APR96} DS2401 Silicon Serial Number \url{http://pdfserv.maxim-ic.com/en/ds/DS2401.pdf} \section{Listing} \begin{quote} \listinginput[1]{1}{2008-03/all_dow31_source_code.txt} \end{quote} \end{document}