icone facebook icone facebook

Objectif
Informations en-ligne
Recherche: ESL
Recherche: TRX
Prototypage
Essais
Solutions

Ceci est toujours un brouillon ! Dernière mise à jour: 19/08/2014
This is still a draft, sorry. Please come back later or use Google translate :)

What you've been waiting for:

Crystal is 10MHz (critical, don't try something else, same goes for resistors !)
LED D1 is 880nm infrared.
AUDIOIN is jack input from phono plug.
U1 can be any ATTiny*5.

ESL

Panier GoTronic:

09571,1
15816,2
03452,1
02460,1
12470,1
16016,1
22538,2
04028,1
04764,1
04020,1
04048,1
04042,1
04060,1
04739,1
15411,1
Total: 16.15 Euros

MCU Source code, hex file
(Fuses: Disable CKDIV8 and enable external crystal)

Android APK (V3 3.07MB)
Android APK (V4 3.08MB)
Android APK (V5 3.09MB)

Objectif des ces pages: Étudier le fonctionnement d'un systeme d'etiquettes electroniques dans le but de prouver qu'elles n'apportent pas plus de securite que des etiquettes papier classiques.

Terminologie:

ESL: Electronic Shelf Label
PL: Price Label, la meme chose
DM: DotMatrix
plId: Price Label Identification
Access key:
Store key:
TRX: Transceiver
BS: Base Station
Page/Register:
Frame:

Quelques informations glanées sur le net, malgré la discrétion assez remarquable de la firme:

Dans une certaine video, on peut voir un employé de magasin lier des étiquettes a des produits.
On peut le voir premièrement scanner l'UPC d'un produit, puis l'ESL correspondante via son interface IR.
La deuxième association rate, et l'employé retourne l'ESL pour lire son code barre (plutôt que de passer par IR).
La troisième association montre que l'étiquette répond à 0:27 (clignotement IR) alors que l'étiquette n'est plus visée. Cela prouve que la mise a jour n'est pas faite par l'appareil portable (qui ne demande que l'ID de l'étiquette), mais par le serveur du magasin.

ESL

 

Étude des étiquettes

Modèle utilisé: Continuum E4 HCN Freezer (version descendant a -30°C). Gracieusement offertes par Docteur Windaube il y a tres longtemps, merci !

ESL

Sur toutes les ESL, on peut trouver a l'arrière un code barre avec son contenu alphanumerique sur un autocollant. C'est un identifiant unique de 17 caractères et un code barre en Code128 lui correspondant. Il est constitue ainsi:

ESL

Le "4" en deuxieme position est commun a toutes les ESL. La lettre indique peut etre le type de produit ?

Pour valider un code, le serveur procede aux verifications suivantes:

  • Le "4" doit etre present
  • Manufacturing unit doit etre egal ou inferieur a 64
  • Manufacturing week doit etre egal ou inferieur a 53
  • Le serial doit etre egal ou inferieur a 65535
  • Le checksum doit etre egal a la somme des 16 precedentes valeurs ASCII modulo 10.

Donc G4591371776312423: Etiquette fabriquee par l'unite 59, dans la 37eme semaine de 2001, serial = 17763, reference produit (1)1242, checksum = 3 (ok).

Le plId correspond a MMYWWSSSSS, soit le Manufacturing unit, l'annee et la semaine de fabrication, et le serial. La formule suivante est utilisee:
plId = long(MMYWW)<<16 + SSSSS = 0xE7014563 dans l'exemple.

Derrière cet autocollant on trouve deux trous dans la coque de l'ESL donnant sur des pastilles du PCB. L'une va au plan de masse, l'autre à l'ASIC. Des impacts de pointes sont visibles, indiquant que c'est probablement via cette interface que les étiquettes sont baptisées en usine.

Note: Je pensais que ca pouvait éventuellement être une PROM ou une EEPROM 1-wire, mais c'en est pas. Ni quoi que ce soit de connu en 1-wire, d'ailleurs. C'est vérifié.

ESL

Quand on veut remplacer du papier par un appareil électronique et qu'on veut réduire leur prix au minimum, on doit se contenter de pas grand chose:

ESL

"PLL band transmitter" dans la doc commerciale: Certainement quelqu'un qui ne savait pas trop ce qu'etait une PLL. Merci pour l'information en tout cas !

Le quartz est taillé a 32768Hz, et sert dès la mise sous tension de l'étiquette (environ >2.2V).
A droite on trouve la photodiode wire-bondée directement sur la carte (D1) et la LED infrarouge de réponse D2, ainsi que son condensateur tantale C4.
Un élévateur de tension génère du 6V sur TP9. Un procédé nomme "precharge" géré par l'infrastructure permet a l'étiquette de recharger ce condensateur entre plusieurs réponses (allant jusqu'a 2 secondes).
TP13: Tension piles (3V).
TP18: Masse.
A noter: 4 fins de pistes sans vernis sont visibles à gauche de R2, possiblement du JTAG ou une interface de programmation ou de debug propriétaire.

En idle, on peut voir la consommation de l'étiquette varier amplement en cadence avec la fréquence du quartz. Un pic de courant est visible a chaque transition du signal d'horloge, soit toutes les 1/(32768*2) = 15.2µs. 50µA en moyenne.

ESL

Les ESL ne tournant qu'a 32kHz, elles ne peuvent avoir qu'une résolution temporelle de 1/32768 = 30.5µs.

Le protocole de communication le plus répandu chez la firme est nomme PP4C et correspond a une modulation par position d'impulsion a 4 états (4PPM), pouvant ainsi coder 2 bits par symbole.

Valeurs des distances selon un fichier xml:
00 = 63 = 24.7% = 100.8µs ? valeur trouvee dans timecalculations
01 = 178 = 69.8% = 284.8µs ?
10 = 101 = 39.6% = 161.6µs ?
11 = 139 = 54.5% = 222.4µs ?

Les écarts sont tous les mêmes (a peu pres):
101-63 = 38 (38 correspondrait a 60.8µs)
139-101 = 38
178-139 = 39

x*63=100.8
x=1.6
x=625kHz

Prescaler 20MHz a 16 = 1.25MHz. 1/(1.25/38) = 30.4µs.
1/fporteuse forcement < 30.4, probablement 20.

1/((20/16/63)/2) = 100.8

Logique CPLD presumee:
Prescaler 16 sur la clock 20MHz, (clock[4]) donne du 1.25MHz.

Carrier est a 4 (plus logique pour 2^4=16) dans un autre fichier xml.

Cycles de porteuse: 24
BurstSeperationTime: 77
AcknowledgementBurstLength: 98
PPMSymbolsLength: 36

A noter que ces valeurs ne correspondent pas a une unité, mais certainement a une valeur de compteur pour diviser la fréquence d'un signal et ainsi générer des temporisations. Ne connaissant pas comment cette division s'opère, je ne peux pas trouver directement de timing clair.

Wakeup: AAAAA... (10 10 10...)

Les bitrates seraient de 10kbps pour le protocole PP4C et 38kbps pour PP16C. Mes étiquettes utilisent PP4C car peu de données sont affichables.

Transmission TRX > Label: IR 940nm

A 10kbps en 4PPM, la durée max d'un bit est de 1/(1024*10/2) = 195,3µs. Si on estime que 10kbps a été arrondi, la durée pourrait se trouver entre 217µs et 177µs, donnant une moyenne de 197µs.

ESL
(La taille des bursts n'est pas a l'échelle)

Cycles mini par symbole: 6. Durée mini: 6*30.5 = 183µs.

En gris, on peut imaginer un burst jamais positionné, on peut penser que ce creux correspond a un cycle d'horloge dans l'ESL pour préparer la mesure de la prochaine position, ou enregistrer la précédente, a chaque symbole. Hypothèse: Il y aurait 6 cycles d'horloge ESL par symbole, donnant un bitrate de 10929kbps ?

BurstSeperationTime = 0x4D = 2*38. Qu'est-ce donc ?

En multipliant la durée d'un créneau par la config, on trouve 1/(30.5/38) = 1.245MHz, fréquence spécifiée dans une doc officielle, qui pourrait être la fréquence du FPGA générant les signaux, ainsi que celle de la porteuse IR (il faut qu'elle soit au minimum de 787kHz). Avec 1.245MHz, on a un burst d'environ 20µs.

Le paramètre PPMCarrierFrequencyCycles est a 24 dans le profil PP4C par défaut de la basestation. On aurait donc une porteuse proche de 1/(30.5/24) = 246kHz, probablement 250kHz puisque 24 est le plus proche. Le paramètre PPMCarrierFrequency est a 5 dans le même profil, indiquant peut être qu'un compteur est utilise pour descendre un 1.25MHz à 250kHz ?

PLAdvancedConfig.prop dit que la longueur par défaut d'un message PP4C est de 20 bytes.

Un brevet indique que le premier champ renseigne la version du protocole, le second l'ID, le troisième la clé (chiottes !), et le reste servirait a remplir les données de l'étiquette.

 

Étude du firmware du TRX, avant de recevoir le TRX:

J'avais a disposition une mise a jour au format Intel hex, convertie de suite en .bin.

Une première analyse visuelle montre que les opcodes sont sur 16 bits, et que celles-ci ne correspondent pas a des instructions Microchip (MSB parfois supérieur a 0x20), ni Atmel.

Une analyse statistique révèle qu'un des mots les plus récurrents est 0x5470 qui, après une rapide recherche Google, s'avère être l'opcode RTS des processeurs H8 (Hitachi, maintenant Renesas).

Une tentative de désassemblage dans IDA génère en effet du code sensé:

ESL

 

Notes:

The authorization code in this embodiment is a 16-bit word.
Brevet EP2309378

The protocol field 41 therefore primarily serves as a "wake-up" field for each label.

 

Etude du logiciel serveur:

Le "arrayOfInt" contient des valeurs ressemblant a celles des durees pour les symboles PP4C.
De plus, les lignes suivantes decomposent "paramByte" en 4 groupes de 2 bits, MSB en premier (i,j,k,m) et ajoute les durees pour chaque.
Note: si on divise les valeurs par 30.5, on obtient: 3.3, 9.3, 5.3 et 7.3. Pas de valeurs entieres, et surtout pas le nombre de cycles trouves plus haut. Il semblerait donc que la duree des bursts n'est pas comprise dans la duree specifiee dans le profil de la basestation !

Si par exemple on veut tomber a 3 au lieu de 3.3 pour la valeur 101, on tombe sur 101/3 = 33.67µs. Ce qui voudrait dire que les bursts durent 33.67-30.5 = 3.15µs. Avec 24 cycles on arrive a une porteuse de 7.62 MHz, ce qui parait un peu trop eleve.
Si plutot on veut tomber a 2 au lieu de 3.3, comme le nombre de cycles trouve pour le symbole PP4C "00" dans l'analyse ci-dessus, on tombe sur 101/2 = 50.5µs. Ce qui voudrait dire que les bursts durent 50.5-30.5 = 20µs. Avec 24 cycles on arrive a une porteuse de... 1.25MHz, pas loin du tout des 1.245MHz vaguement specifies dans la doc !

On sait donc que les cycles correspondants ne sont pas 3,9,5,7 mais 2,5,3,4

60=0x3C soit la commande utilisee dans WakeUpFrames.xml pour reveiller les E4 HCN Freezer (selon WakeUpSchemes).
La frame serait donc constituee de 60,boolean1=128/0=0,paramByte,1=128/0=0,longtoaob(paramlong),aob de 2 bytes a 0 ?,null

longtoaob(long paramLong) retourne un arrayOfByte de 4 bytes, avec paramLong dedans 0=LSB 3=MSB

Longueur wakeup frame: 1,1,1,1,4,2,0 = 10 (byte,byte,byte,byte,aob,aob,null)

Checksum function (CRC16 avec une valeur de depart a 33800):

crc = 33800
Pour chaque byte de aob: crc = table[(crc ^ aob[i]) & 0xFF] ^ (crc >> 8);

On peut mettre a jour le firmware des etiquettes via IR (verifier sa version, et -peut etre- le lire ?)

 

 

Etude du TRX:

WO0209322

RS485 et 48V en entree. Oscillateur 20MHz.

H8/3687 et CPLD Lattice 4064V

Reception IR par SA636, generation d'IF 10.7MHz par AD9833 sinus filtré LC. Discrimination a 455MHz (10.7-0.455 = 1.245MHz !).
La porteuse de reponse est a 1.245MHz. Peut etre d'emission aussi ?

Filtre ceramique, logo Murata marquage XH:

ESL

CPLD clock a 20MHz, aussi une entree a 10MHz. Porteuses d'emission possibles:

20 (1), 10 (2), 6.66 (3), 5 (4), 4 (5, la plus probable), 3.33 (6), 2.86 (7), 2.5 (8), 2.22 (9), 1.81 (10), 1.66 (11), 1.53 (12), 1.43, 1.33, 1.25, 1.17

On trouve une connexion UART 38400bps sur le µC, qui semble etre unidirectionelle:

***** TRX INIT *****
Firmware:
Compile date: Feb  4 2007
Compile time: 20:39:15
PON Counter:0001
TCSRWD:AA
WOKE UP FROM POWER ON
WATCHDOG INITIATION STARTED!
WATCHDOG INITIATION COMPLETED!
irrxSetup:
 Intg. Time:02E1
 Noise Time:02C2
 PreFB Time:0DD8
 RIM Time  :1F95
CABLE: TxError
CABLE: RxError
CABLE: 48V Error
FELIF: Closed (HW error)
Hello: 0000632F
Hello: 0000C651
Hello: 00012BCD

L'µC detecte la presence du 48V avec un pont diviseur directement sur l'alimentation (avant la diode): 100k et 4.7k, donnant 2.15V sur une broche ADC. En ajoutant 100k en parallele sur la resistance 100k deja presente (=50k), et en alimentant en 30V seulement, l'erreur disparait.

TxError et RxError semblent etre liees a une mesure electrique, et pas un echange de donnees (rien sur la liaison RS485 au demarrage).
FELIF closed ? J'espere que c'est lie a l'absence de 48V...

ESL

Corrections aux suppositions sur le PP4C grace a la doc trouvée par Biduleohm:

Les bursts ne font pas 30.5 µs mais 41µs.

ESL



Liste
creative commons
date
CC:BY,NC,SA - Engine V2.0
9ms
03/12/2160 *1
symbol symbol symbol symbol symbol