𑇢^^^°< Technical stuff https://wiki.arthus.net/ Sat, 24 May 2025 03:02:09 +0200 Sat, 24 May 2025 03:02:09 +0200 Pico Bookeen Cybook Orizon : Tear Down and Serial IO <h1>Hacking with the Bookeen Cybook Orizon Tear down and Serial connection</h1> <p>[toc]</p> <p>The <a href="https://wiki.mobileread.com/wiki/Cybook_Orizon">Cybook Orizon</a> is a 2010 ereader by now defunct french maker <a href="https://fr.wikipedia.org/wiki/Bookeen">Bookeen</a>.<br /> Under the hood is a Gnu/Linux OS running closed/proprietary software for the e-reader/UI part.<br /> Fortunately, a serial connector is available on the motherboard PCB and allows root access, so we can setup an SSH connection, and even a ftp server ! </p> <p>Let's see what we can do with this toy...</p> <h2>External power needed</h2> <p>You need to have a 4.5V power source plugged in the J182 connector in order to be able to boot. Otherwise, the device stays in a bootloop an keeps resetting. The original battery is a 4.55Wh LiPo 1230mAh battery (not sourceable as of 2025), but plugging in any LiPo battery should be ok.<br /> You can also use a step-up/step-down converter to get the needed voltage and use that. </p> <p><strong>Powering the device via the micro USB port won't work.</strong> </p> <h2>Connecting SIO</h2> <p>The serial connection is on the debug connector JA901 at the bottom left of the board (with battery at the bottom):</p> <p><img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_ja901_debug_connector.jpg" alt="JA901 location on mb" /></p> <p>Pinout is (right to left with the battery at the bottom) :</p> <table> <thead> <tr> <th>Pin</th> <th>Usage</th> </tr> </thead> <tbody> <tr> <td>1 TX1</td> <td>UNUSED</td> </tr> <tr> <td>2 RX1</td> <td>UNUSED</td> </tr> <tr> <td>3 TX0</td> <td><strong>SERIAL TX</strong></td> </tr> <tr> <td>4 RX0</td> <td><strong>SERIAL RX</strong></td> </tr> <tr> <td>5 TX3</td> <td>UNUSED</td> </tr> <tr> <td>6 RX3</td> <td>UNUSED</td> </tr> <tr> <td>7-13</td> <td>?</td> </tr> <tr> <td>14-16 GND</td> <td><strong>SERIAL GND</strong></td> </tr> <tr> <td>16-18 VDD</td> <td><strong>SERIAL VCC (3.3V)</strong></td> </tr> </tbody> </table> <p><img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_serial_ttl.jpg" alt="JA901 pinout" /></p> <p>Once physical connection is done, you can use a FTDI232RL/CH340 USB to TTL adapter, or using GPIOs if you have a RPI, to connect to the cybook.</p> <p>Connect the adapter to the computer, launch minicom, then hold the power button for a few seconds to start the device. </p> <p>Minicom : </p> <pre><code class="language-bash">sudo minicom -b 115200 -D /dev/ttyUSB0</code></pre> <p>Booting :</p> <pre><code class="language-bash">FnX Bootloader for s3c2416 build on confucius version master_6376fd19638ef062_b360 Build time "Mon, 11 Oct 2010 14:15:38 +0200" Copyright (C) 2010 Bookeen Detected: Bookeen Cybook Orizon, A00/A01/A022;FnX - Bookeen Cybook Orizon - Terminal Battery level: [==================================== ] Info: Battery condition reasonable Info: Reset/boot due to Software reset I0: 00000000... Starting: Uncompressing Linux.......................................................................... ***: Cybook Linux Starting... ***: Prepare filesystem... ***: Does software want to update? No ***: Check if user want to update... ***: Verify partitions... fsck 1.41.9 (22-Aug-2009) rootfs: clean, 1177/38456 files, 120508/153600 blocks boot: clean, 15/3840 files, 9958/15360 blocks (check deferred; on battery) privatefs: recovering journal privatefs: clean, 66/2560 files, 1516/10240 blocks (check deferred; on battery) ***: Continue booting..... ***: Doing critical nasty things...... ***: Starting BooReader... Welcome to your Cybook Orizon! CybookOrizon login: root login[872]: root login on 'ttySAC0' [root@CybookOrizon ~]#</code></pre> <p>Default login is 'root' with no password. </p> <h2>Keep the device awake</h2> <p>You need to either power the device via micro USB, or kill processes <code>ebrmain</code> and <code>boordr</code> :</p> <pre><code class="language-bash">pkill ebrmain pkill boordr </code></pre> <h2>Wifi connection</h2> <h3>Firmware loading</h3> <p>You can load the wifi firmware and enable the wifi interface (which will apear as 'eth0') with the init script that's in <code>/etc/init.d</code> :</p> <pre><code class="language-bash">/etc/init.d/wireless start [root@CybookOrizon ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:27:13:F7:E3:F7 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:58 (58.0 B) TX bytes:0 (0.0 B) </code></pre> <h3>Connecting to a network</h3> <p>You can use <code>iwlist scan</code> to search for your network, which you can then connect to using <code>wpa_supplicant</code>.</p> <p>Edit <code>/etc/network/interfaces</code> and add the following lines :</p> <pre><code>auto eth0 iface eth0 inet dhcp</code></pre> <p>Create the file <code>/etc/wpa_supplicant.conf</code> that should contain :</p> <pre><code>network={ ssid="yourSSID" psk="yourPSK" }</code></pre> <p>Then run <code>wpa_supplicant -Dwext -ieth0 -c/etc/wpa_supplicant.conf &amp;</code> and once connected, use the network init script :</p> <pre><code>/etc/init.d/network start</code></pre> <p>You should now be connected to your Wireless AP.</p> <h3>SSH connection</h3> <p>By default the root account has no password, so you should change it in order to be able to connect via SSH :</p> <pre><code>passwd # then type your password two times</code></pre> <p>Finally, you can start the dropbear ssh server with <code>/etc/init.d/dropbear start</code>.</p> <p>As this is quite an old version of dropbear, the generating utility <code>dropbearkey</code> only comes with rsa/dss, and the only available key exchange algorithm is SHA-1, which was disabled in openssh 8.8.</p> <p>If you plan on using an ssh key to login, you'll have to re-enable those algorithms :</p> <pre><code>ssh -o KexAlgorithms=diffie-hellman-group1-sha1 -o HostkeyAlgorithms=ssh-rsa -i .ssh/bookeen_rsa_key root@10.10.10.10</code></pre> <p>You can generate a key on your host with <code>ssh-keygen</code> :</p> <pre><code>ssh-keygen -t rsa -f ~/.ssh/cybook_orizon</code></pre> <p>then create a file on the orizon in '/root/.ssh/' named 'authorized_keys' with the content of the file '~/.ssh/cybook_orizon.pub'. </p> <h4>sh: /usr/libexec/sftp-server: No such file or directory</h4> <p>If you encounter the following error message when trying to use <code>scp</code>:</p> <pre><code>sh: /usr/libexec/sftp-server: No such file or directory</code></pre> <p>It means the openssh version on the client host is <a href="https://www.openssh.com/txt/release-9.0">9.0 or newer</a> and theses versions now use SFTP instead of the legacy scp/rcp protocol.</p> <p>You need to use the '-O' flag (uppercase letter o) with <code>scp</code>.</p> <h2>Software versions</h2> <p>uname :</p> <pre><code>Linux CybookOrizon 2.6.21.5-cfs-v19 #528 Tue Mar 29 13:21:06 CEST 2011 armv5tejl GNU/Linux</code></pre> <p>busybox:</p> <pre><code>BusyBox v1.16.1 (2010-05-19 17:50:51 CEST) multi-call binary.</code></pre> <p>dropbear:</p> <pre><code>Dropbear sshd v0.52</code></pre> <p>proftpd:</p> <pre><code>ProFTPD Version 1.3.0a</code></pre> <h2>Proprietary apps</h2> <p>They are located in <code>/mnt/app/</code> :</p> <pre><code>-rwx------ 1 1003 513 23.3M May 27 2011 boordr* -rwx------ 1 1003 513 737.8K May 27 2011 ebrmain* -rwx------ 1 root root 39.7K May 27 2011 showImage*</code></pre> <p>The ressources for these (UI, fonts, graphics, etc. ) are in <code>/mnt/app/res</code>. </p> <p>They are archived <a href="https://wiki.arthus.net/assets/cybook_orizon_apps.tar.bz2">here.</a> </p> <h3>showImage</h3> <p>This seems to be a tool to convert </p> <p>size : 40627<br /> md5sum: b4dccfdb0df5f7ddc1e0dea2f9743bc5 </p> <pre><code>showImage: ELF 32-bit LSB executable, ARM, EABI4 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.14, with debug_info, not stripped</code></pre> <pre><code>usage: showImage [image path] [cmd] [data1] [data2] cmd = 1: show the information of the image cmd = 2: show raw data image data1: Width data2: Height cmd = 3: change image file to specify the number of bits per pixel data1 = 16: 16 bits data1 = 24: 24 bits data1 = 32: 32 bits cmd = 4: change image file to gray image in specified steps gray scale data1 = 4: 4 bits (16 steps gray scale) dat1a = 8: 8 bits (256 steps gray scale) cmd = 5: flip image data1 = 1: flip vertical data1 = 2: flip horizontal cmd = 6: generate raw data cmd = 7: generate header file data1 = 1: bmp file data1 = 2: raw data </code></pre> <h3>boordr</h3> <p>This seems to be the UI/ereader part, with access to settings, store, library, etc.</p> <p>size : 24392984<br /> md5sum: 4f17c6f703347d56a3b2bf4338482f5e </p> <h3>ebrmain</h3> <p>This looks like its the 'main' thread, responsible for setting things up, then spawn <code>boordr</code>.</p> <p>size: 755536<br /> md5sum: 3a7e2835672305c7e57b91b865da225f </p> <h2>Content informations</h2> <p>/sbin :</p> <pre><code>/sbin/duma.sh /sbin/bootbar /sbin/shutdown /sbin/CybUpdate /sbin/showImage /sbin/sfdisk</code></pre> <p>/usr/bin :</p> <pre><code>/usr/bin/lockfile-remove /usr/bin/bash /usr/bin/sqlite3 /usr/bin/i2cdetect /usr/bin/uuidgen /usr/bin/lsattr /usr/bin/lockfile-touch /usr/bin/bashbug /usr/bin/chattr /usr/bin/lockfile-create /usr/bin/i2cset /usr/bin/nano /usr/bin/i2cdump /usr/bin/i2cget /usr/bin/strace</code></pre> <p>/usr/sbin : </p> <pre><code>/usr/sbin/wlarm /usr/sbin/badblocks /usr/sbin/wpa_passphrase /usr/sbin/iptables-multi /usr/sbin/uuidd /usr/sbin/dhdarm /usr/sbin/dosfslabel /usr/sbin/mke2fs /usr/sbin/proftpd /usr/sbin/s3c_wifi_cmd /usr/sbin/eeprog /usr/sbin/dumpe2fs /usr/sbin/avahi-autoipd /usr/sbin/iwspy /usr/sbin/e2freefrag /usr/sbin/e2undo /usr/sbin/blkid /usr/sbin/dosfsck /usr/sbin/mklost+found /usr/sbin/e2label /usr/sbin/mkdosfs /usr/sbin/iwconfig /usr/sbin/wpa_cli /usr/sbin/fsck /usr/sbin/filefrag /usr/sbin/ip6tables-multi /usr/sbin/wpa_supplicant /usr/sbin/dropbear /usr/sbin/iwpriv /usr/sbin/iwlist /usr/sbin/logsave /usr/sbin/e2fsck</code></pre> <h2>System informations</h2> <p>df -h</p> <pre><code>Filesystem Size Used Available Use% Mounted on /dev/mmcblk0p2 145.3M 113.4M 24.3M 82% / tmpfs 10.0M 4.0K 10.0M 0% /tmp tmpfs 10.0M 0 10.0M 0% /dev tmpfs 10.0M 24.0K 10.0M 0% /var /dev/mmcblk0p3 9.7M 1.9M 7.3M 20% /private /dev/mmcblk0p3 9.7M 1.9M 7.3M 20% /etc /dev/mmcblk0p3 9.7M 1.9M 7.3M 20% /root /dev/mmcblk0p1 14.5M 9.2M 4.5M 67% /boot</code></pre> <p>lsmod :</p> <pre><code>Module Size Used by Not tainted dhd 239700 0 hspi_s3c2443 10784 1 dhd spi_dev 4776 1 hspi_s3c2443</code></pre> <h2>Kernel images</h2> <pre><code>binwalk uImage-BK0.bin /home/foo/cybook/boot/uImage-BK0.bin ------------------------------------------------------------------------------------------------------------------------------------------ DECIMAL HEXADECIMAL DESCRIPTION ------------------------------------------------------------------------------------------------------------------------------------------ 12952 0x3298 gzip compressed data, operating system: Unix, timestamp: 2011-03-29 11:21:25, total size: 4102506 bytes ------------------------------------------------------------------------------------------------------------------------------------------ Analyzed 1 file for 85 file signatures (187 magic patterns) in 75.0 milliseconds</code></pre> <p><a href="https://wiki.arthus.net/assets/uImage-BK0.tar.bz2">Archived here.</a> </p> <p>You can extract the content of the archive with <code>7z</code> :</p> <pre><code>7z x uImage-BK0.bin</code></pre> <pre><code>binwalk uImage-BK0 /home/foo/cybook/boot/uImage-BK0 -------------------------------------------------------------------------------------------------------------------------------------- DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------------------------------------------------------------- 89280 0x15CC0 gzip compressed data, operating system: Unix, timestamp: 2011-03-29 11:20:46, total size: 2802743 bytes 4802100 0x494634 CRC32 polynomial table, little endian 5178818 0x4F05C2 Copyright text: "Copyright (C) 2004-2005 Intel Corporation &lt;jketreno@linux.intel.com&gt; " -------------------------------------------------------------------------------------------------------------------------------------- Analyzed 1 file for 85 file signatures (187 magic patterns) in 53.0 milliseconds</code></pre> <p>Running <code>7z</code> again on the data gives us a CPIO archive, agin, extractable with <code>7z</code>:</p> <pre><code>mv uImage-BK0 uImage-BK0-uncomp 7z x uImage-BK0-uncomp file uImage-BK0-uncomp uImage-BK0-uncomp: ASCII cpio archive (SVR4 with no CRC) 7z -o cpio/ x uImage-BK0-uncomp </code></pre> <pre><code>tree -a cpio/ ./ ├── bin │   └── busybox ├── boot ├── cpio.md ├── dev │   ├── console │   ├── cyio │   ├── epaper │   ├── i2c-0 │   ├── i2c-1 │   ├── i2c-2 │   ├── i2c-3 │   ├── input │   │   ├── event0 │   │   ├── event1 │   │   ├── event2 │   │   ├── event3 │   │   ├── mice │   │   ├── mouse0 │   │   ├── mouse1 │   │   ├── mouse2 │   │   └── mouse3 │   ├── kmem │   ├── loop0 │   ├── loop1 │   ├── mem │   ├── mmcblk0 │   ├── mmcblk0p1 │   ├── mmcblk0p2 │   ├── mmcblk0p3 │   ├── mmcblk0p4 │   ├── mmcblk1 │   ├── mmcblk1p1 │   ├── net │   │   └── tun │   ├── null │   ├── psaux │   ├── ptmx │   ├── pts │   ├── ptyp0 │   ├── ptyp1 │   ├── ptyp2 │   ├── ptyp3 │   ├── ptyp4 │   ├── ptyp5 │   ├── ptyp6 │   ├── ptyp7 │   ├── ptyp8 │   ├── ptyp9 │   ├── ram │   ├── ram0 │   ├── ram1 │   ├── ram2 │   ├── ram3 │   ├── random │   ├── rtc │   ├── s3c_wifi_cmd │   ├── shm │   ├── tty │   ├── tty0 │   ├── tty1 │   ├── tty2 │   ├── tty3 │   ├── tty4 │   ├── tty5 │   ├── tty6 │   ├── tty7 │   ├── ttyp0 │   ├── ttyp1 │   ├── ttyp2 │   ├── ttyp3 │   ├── ttyp4 │   ├── ttyp5 │   ├── ttyp6 │   ├── ttyp7 │   ├── ttyp8 │   ├── ttyp9 │   ├── ttyS0 │   ├── ttyS1 │   ├── ttyS2 │   ├── ttyS3 │   ├── ttySAC0 │   ├── ttySAC1 │   ├── ttySAC2 │   ├── ttySAC3 │   ├── urandom │   └── zero ├── etc │   ├── colors │   ├── filesystems │   ├── fstab │   ├── group │   ├── hostname │   ├── hosts │   ├── init.d │   │   ├── boot │   │   ├── dropbear │   │   ├── ebrmain │   │   ├── network │   │   ├── rcK │   │   ├── rcS │   │   ├── rcS.old │   │   ├── update │   │   └── urandom │   ├── inittab │   ├── inputrc │   ├── issue │   ├── ld.so.cache │   ├── ld.so.conf.d │   ├── mke2fs.conf │   ├── passwd │   ├── profile │   ├── protocols │   ├── random-seed │   ├── rc.d │   ├── securetty │   ├── services │   ├── shadow │   └── TZ ├── init ├── init~ ├── lib │   ├── ld-2.6.1.so │   ├── ldscripts │   │   ├── armelfb_linux_eabi.x │   │   ├── armelfb_linux_eabi.xbn │   │   ├── armelfb_linux_eabi.xc │   │   ├── armelfb_linux_eabi.xd │   │   ├── armelfb_linux_eabi.xdc │   │   ├── armelfb_linux_eabi.xdw │   │   ├── armelfb_linux_eabi.xn │   │   ├── armelfb_linux_eabi.xr │   │   ├── armelfb_linux_eabi.xs │   │   ├── armelfb_linux_eabi.xsc │   │   ├── armelfb_linux_eabi.xsw │   │   ├── armelfb_linux_eabi.xu │   │   ├── armelfb_linux_eabi.xw │   │   ├── armelf_linux_eabi.x │   │   ├── armelf_linux_eabi.xbn │   │   ├── armelf_linux_eabi.xc │   │   ├── armelf_linux_eabi.xd │   │   ├── armelf_linux_eabi.xdc │   │   ├── armelf_linux_eabi.xdw │   │   ├── armelf_linux_eabi.xn │   │   ├── armelf_linux_eabi.xr │   │   ├── armelf_linux_eabi.xs │   │   ├── armelf_linux_eabi.xsc │   │   ├── armelf_linux_eabi.xsw │   │   ├── armelf_linux_eabi.xu │   │   └── armelf_linux_eabi.xw │   ├── libblkid.so.1.0 │   ├── libc-2.6.1.so │   ├── libcom_err.so.2.1 │   ├── libdl-2.6.1.so │   ├── libe2p.so.2.3 │   ├── libext2fs.so.2.4 │   ├── libgcc_s.so.1 │   ├── libintl.so.8.0.1 │   ├── libm-2.6.1.so │   ├── libpthread-2.6.1.so │   └── libuuid.so.1.2 ├── mnt │   ├── app │   ├── fat │   ├── root │   │   ├── boot │   │   ├── mnt │   │   │   └── fat │   │   └── private │   └── sd ├── newroot ├── proc ├── sbin │   ├── bootbar │   ├── CybUpdate │   ├── dosfsck │   ├── e2fsck │   ├── fsck │   ├── kparam.sh │   ├── mkdosfs │   ├── mke2fs │   ├── sfdisk │   ├── shutdown │   └── shutdown~ ├── sys ├── tmp ├── usr └── var ├── lib ├── log └── run 33 directories, 160 files</code></pre> <h2>CPU info</h2> <pre><code>cat /proc/cpuinfo Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 199.47 Features : swp half thumb fastmult edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Cache type : write-back Cache clean : cp15 c7 ops Cache lockdown : format C Cache format : Harvard I size : 16384 I assoc : 4 I line length : 32 I sets : 128 D size : 16384 D assoc : 4 D line length : 32 D sets : 128 Hardware : Cybook Orizon Revision : 0100 Serial : 0000000000000000</code></pre> <h2>Hardware components</h2> <p>SOC : <a href="https://elinux.org/S3C2416">S3C2416</a><br /> Screen: <a href="https://wiki.mobileread.com/wiki/SiPix">Sipix</a> AUO 6" 800x600 A0608E02<br /> Display controller : <a href="https://cateee.net/lkddb/web-lkddb/FB_AUO_K1900.html">AUO K-1900</a><br /> Video DRAM : Etron Tech EM686165VE-7H<br /> Wifi/Bluetooth : <a href="https://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;ved=0CCwQFjAA&amp;url=http%3A%2F%2Fmr2857gb.googlecode.com%2Fsvn%2Ftrunk%2Fdata%2520sheet%2Fwifi%2FWM-BN-BM-01_PRD_v2.3%252020091221.pdf&amp;ei=97esUYSvJ6PT0QWqjYGYDQ&amp;usg=AFQjCNGDYlpKc_9zgodMOIT3pAZfGHf7eQ&amp;bvm=bv.47244034,d.d2k">USI WM-BN-BM-01-0</a><br /> Storage : Hynnix H26M210010AR e-NAND 2GB Flash<br /> Memory : 32MB<br /> CPU : 200 Mhz<br /> Battery : LiPo HC 4.55Wh H3234105 1230mAh (35mm x 100mm x 3mm)</p> <h2>Misc</h2> <h3>Nano</h3> <p>If your client exports the environnment variable <code>TERM</code> as <code>xterm-256color</code>, you'll get an error when trying to run <code>nano</code> :</p> <pre><code>Error opening terminal: xterm-256color.</code></pre> <p>You can solve this by setting the <code>$TERM</code> value to <code>xterm</code> when SSHing :</p> <pre><code>TERM=xterm ssh 10.10.10.10</code></pre> <h3>proftpd</h3> <p>Edit '/etc/proftpd.conf' and add a <code>DefaultAddress</code> and <code>RootLogin</code> directive, e.g: </p> <pre><code>ServerName "ProFTPD" ServerType standalone DefaultServer on DefaultAddress 10.42.0.58 Port 21 Umask 022 MaxInstances 30 User nobody Group nogroup AllowOverwrite on UserAlias anonymous ftp RootLogin on</code></pre> <p>You also have to create the <code>/var/run/proftpd</code> folder : </p> <pre><code>mkdir /var/run/proftpd</code></pre> <h3>bootsplash screen</h3> <p>The boot splash picture is in <code>/boot/</code> and is a 600x800 greyscale, indexed 16 colors bmp file (filesize 240,1 KB). </p> <p><strong>If using gimp to edit it, make sure to check the compatibility option "Do not write colorspace information".</strong> </p> <p>Then, to replace it, you first have to mount <code>/boot</code> as rw ;</p> <pre><code>mount /boot mount -o remount,rw /boot</code></pre> <p>then edit your boot splash pic, and put it on the device as <code>/boot/bootsplash.bmp</code> via ssh:</p> <pre><code>scp bootsplash.bmp CybookOrizonIP:/boot/</code></pre> <p><img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_bootsplash.jpg" alt="Custom bootsplash" /></p> <h3>Screensaver and thumbnail file formats</h3> <p>The file format is <code>t4b</code>, and you can find some scripts to convert from an to this format here : </p> <p><a href="https://github.com/ABelliqueux/t4b-tools">https://github.com/ABelliqueux/t4b-tools</a> </p> <p>The default screen saver pictures are in <code>/mnt/app/res/ds</code>.<br /> Most UI assets are in <code>/mnt/app/res/img</code>.</p> <p><a href="https://nachtimwald.com/2010/01/13/cybook-t4b-format-specification/">https://nachtimwald.com/2010/01/13/cybook-t4b-format-specification/</a> </p> <h3>Wifi + SSH at boot</h3> <p>In order to enable Wireless, connect to your AP and start the SSH server automatically at boot, you can create a script in <code>/etc/init.d</code> with this content :</p> <pre><code># Start ALL the things ! # case "$1" in start) echo "Killing useless processes..." pkill ebrmain pkill boordr echo "Enabling wireless" /etc/init.d/wireless start echo "Connecting to AP..." wpa_supplicant -B -Dwext -ieth0 -c/etc/wpa_supplicant.conf sleep 3 echo "Init network" /etc/init.d/network stop /etc/init.d/network start echo "Starting SSH..." /etc/init.d/dropbear start ;; stop) echo -n "Stopping all the things !" /etc/init.d/dropbear stop /etc/init.d/network stop /etc/init.d/wireless stop ;; restart|reload) "$0" stop "$0" start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit $?</code></pre> <p>Make sure the script has the right owner/permissions :</p> <pre><code>chmod 755 /etc/init.d/* chown default:default /etc/init.d/*</code></pre> <p>Then, remove/backup the existing symlinks in <code>/etc/rc.d</code> : </p> <pre><code>rm /etc/rc.d/*</code></pre> <p>and create a new one to your script :</p> <pre><code>ln -s /etc/init.d/custom /etc/rc.d/S05custom</code></pre> <h3>Input</h3> <p>The Cybook's physical buttons (up, left, down, right, middle and on/off/sleep) can be accessed from <code>/dev/cyio</code><br /> Pressing a button triggers the following packets :</p> <table> <thead> <tr> <th>Button</th> <th>Packet content HEX</th> <th>ASCII</th> </tr> </thead> <tbody> <tr> <td>Left</td> <td>6B 80 10 6C</td> <td>l</td> </tr> <tr> <td>Up</td> <td>6B 80 10 75</td> <td>u</td> </tr> <tr> <td>Right</td> <td>6B 80 10 72</td> <td>r</td> </tr> <tr> <td>Down</td> <td>6B 80 10 64</td> <td>d</td> </tr> <tr> <td>Center</td> <td>6B 80 10 65</td> <td>e</td> </tr> <tr> <td>Sleep</td> <td>6B 80 10 6F</td> <td>o</td> </tr> </tbody> </table> <p><img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/cyio.png" alt="Cybook IO" /> </p> <h2>Pictures</h2> <p><img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-01.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-02.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-03.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-04.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-05.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-06.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-07.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-08.jpg" alt="screen_A0608E02 connector" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-09.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-10.jpg" alt="bookeen orizon tear up" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-11.jpg" alt="AUO K1900 - Etrontech EM686165VE-7H" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-12.jpg" alt="AUO K1900" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_orizon-13.jpg" alt="unpopuated USB" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_screen_A0608E02.jpg" alt="screen_A0608E02" /><br /> <img src="https://wiki.arthus.net/assets/bidouille/demontage_d_un_bookeen_orizon/bookeen_cybook_orizon_hynnix_H26M210010AR.jpg" alt="_hynnix_H26M210010AR" /> </p> <h2>Links</h2> <p><a href="http://wiki.mobileread.com/wiki/Cybook_Orizon">http://wiki.mobileread.com/wiki/Cybook_Orizon</a><br /> <a href="https://www.e-ink-info.com/why-did-bookeen-use-sipix-and-not-e-ink-their-upcoming-orizon-reader">https://www.e-ink-info.com/why-did-bookeen-use-sipix-and-not-e-ink-their-upcoming-orizon-reader</a><br /> <a href="https://web.archive.org/web/20101203015220/http://www.fwma.de/pmwiki/pmwiki.php?n=Main.OYO">https://web.archive.org/web/20101203015220/http://www.fwma.de/pmwiki/pmwiki.php?n=Main.OYO</a><br /> <a href="https://shkspr.mobi/blog/2013/04/disassembling-an-ereader/">https://shkspr.mobi/blog/2013/04/disassembling-an-ereader/</a><br /> <a href="https://wiki.techinc.nl/OYO_Hacking">https://wiki.techinc.nl/OYO_Hacking</a><br /> <a href="https://web.archive.org/web/20141218033547/http://ownyo.de/">https://web.archive.org/web/20141218033547/http://ownyo.de/</a><br /> <a href="https://p2k.unkris.ac.id/IT/2-3065-2962/Qisda-ES900_21112_p2k-unkris.html">https://p2k.unkris.ac.id/IT/2-3065-2962/Qisda-ES900_21112_p2k-unkris.html</a><br /> <a href="https://blog.soutade.fr/post/2015/03/game_over.html">https://blog.soutade.fr/post/2015/03/game_over.html</a></p> Thu, 01 May 2025 02:00:00 +0200 https://wiki.arthus.net/?hacking_with_bookeen_cybook_orizon https://wiki.arthus.net/?hacking_with_bookeen_cybook_orizon Générer un graphique des statistiques réseau adhérent·e FDN <h1>Générer un graphique des statistiques réseau adhérent·e FDN</h1> <p>[toc]</p> <p>Il est possible aux adhérent·e·s FDN de télécharger un fichier <a href="https://fr.wikipedia.org/wiki/RRDTool">rrd</a> contenant les statistiques d'une ligne.<br /> Ce fichier est disponible dans l'<a href="https://vador.fdn.fr/adherents/">espace adhérent·e</a>, section "Statistiques réseau" du menu "Informations techniques". </p> <p>On peut à partir de ce fichier générer un graphique grâce à l'outil <a href="https://oss.oetiker.ch/rrdtool/">RRDtool</a>. </p> <h5>La commande utilisée par le SI FDN</h5> <p>Le SI FDN utilise un script Perl pour générer ce graphique, dont les sources sont disponibles ici : </p> <p><a href="https://git.fdn.fr/adminsys/si/-/blob/main/cgi/adh/adh-statimg.cgi?ref_type=heads#L333">https://git.fdn.fr/adminsys/si/-/blob/main/cgi/adh/adh-statimg.cgi?ref_type=heads#L333</a></p> <p>En bash, la commande pour générer un graphique similaire est la suivante (ici le nom de fichier en entrée est 'fichier.rrd', penser à adapter cette valeur) :</p> <pre><code class="language-sh">rrdtool graph out.png --imgformat=PNG --start=-604800 --end=-1800 --title='Traffic' --rigid --base=1000 \ --height=240 --width=1000 --alt-autoscale-max --lower-limit=0 --vertical-label='bits par secondes' \ DEF:i1='fichier.rrd':traffic_in:AVERAGE \ DEF:o1='fichier.rrd':traffic_out:AVERAGE \ CDEF:cdefa=i1,8,* \ CDEF:cdefe=o1,8,* \ CDEF:mx=0,0,EXC,i1,UN,0,i1,IF,+,EXC,o1,UN,0,o1,IF,+,MAX,8,* \ VDEF:pct=mx,95,PERCENT \ AREA:cdefa#00CF00:'Entrée' \ GPRINT:cdefa:LAST:' Courant\:%8.2lf %s' \ GPRINT:cdefa:AVERAGE:'Moyenne\:%8.2lf %s' \ GPRINT:cdefa:MAX:'Maximum\:%8.2lf %s' \ LINE1:cdefe#002A97:'Sortie' \ GPRINT:cdefe:LAST:'Courant\:%8.2lf %s' \ GPRINT:cdefe:AVERAGE:'Moyenne\:%8.2lf %s' \ GPRINT:cdefe:MAX:'Maximum\:%8.2lf %s' \ LINE1:pct#FF0000:'95e ' \ GPRINT:pct:'95e centile\:%8.2lf %s'</code></pre> <p>Cette commande génère un fichier png "out.png" de ~240x1000 pixels, dans l'interval temporel -604800 secondes (une semaine dans le passé) à -1800 (30 minutes dans le passé). </p> <p>Les paramètres sur lesquels on voudra éventuellement jouer pour personnaliser/améliorer le graphique résultant sont les suivants :</p> <ul> <li><code>--start=</code> et <code>--end=</code> : bornes de l'interval qu'on souhaite représenter en secondes. </li> <li><code>--height</code> et <code>--width</code> : dimensions de l'image en pixels </li> <li><code>--imgformat</code> : peut être PNG|SVG|EPS|PDF|XML|XMLENUM|JSON|JSONTIME|CSV|TSV|SSV (penser à adapter l'extension de 'out.png') </li> <li>Les différentes couleurs sont représentées par un code héxadécimal du type #RRGGBB ()</li> </ul> <h5>Bornes d'intervals usuels</h5> <p>Les bornes d'intervals suivantes sont utilisées par le script du SI :</p> <pre><code>* quotidien : -86400, -300 * hebdomadaire : -604800, -1800 * mensuel : -2678400, -7200 * annuel : -33053184, -86400</code></pre> <p>Le calcul est simple, on multiplie les secondes par le nombre de minutes, heures, jour, etc. Exemple pour 4 jours : <code>60s * 60m * 24h * 4j</code> qui donne 345600 secondes.</p> <p><strong>Ne pas oublier le signe mathématique '-' (moins) devant le nombre (on regarde dans le passé dans la plupart des cas).</strong></p> Thu, 10 Apr 2025 02:00:00 +0200 https://wiki.arthus.net/?rrdtool-fdn https://wiki.arthus.net/?rrdtool-fdn Utilisation du TommyProm32 <h1>Utilisation du TommyProm32</h1> <p>[toc]</p> <h2>Matériel nécessaire</h2> <ul> <li>Un <a href="https://github.com/TomNisbet/TommyPROM/">TommyProm32</a></li> <li>Une (E)EPROM (<a href="https://wiki.arthus.net/assets/SST39SF.pdf">SST 39SF040</a> par exemple)</li> </ul> <h2>Flasher le TommyProm32 avec la configuration pour SST</h2> <p>En fonction du type de puce à flasher, il faut reprogrammer l'Arduino nano présent sur le PCB, via le logiciel 'Arduino'.</p> <ol> <li>Installer le <a href="https://www.arduino.cc/en/software">logiciel arduino</a> </li> <li><a href="https://www.robot-maker.com/ouvrages/tuto-arduino/installer-configurer-ide-arduino/">Configurer</a> le logiciel Arduino pour utiliser la bonne carte.</li> <li>Télécharger <a href="https://github.com/TomNisbet/TommyPROM/archive/refs/heads/master.zip">le sketch arduino du TommyProm32 </a> </li> <li>Extraire les fichiers dans le dossier de votre choix et ouvrir le projet <code>TommyPROM.ino</code> qui se trouve dans le dossier 'TommyPROM'.</li> <li>Dans le fichier 'Configure.h', dé-commenter la ligne correspondant à votre type de puce en supprimant les <code>//</code> qui se trouvent devant (lignes 9 à 14). </li> <li>Vérifier et téléverser le sketch. </li> </ol> <p><img src="https://wiki.arthus.net/assets/arduino-upload.png" alt="Arduino IDE GUI" /></p> <h3>Cas de l'utilisation d'un clône Arduino LGT8F328P</h3> <p>Ces cartes peu onéreuses (~3$) nécessitent <a href="https://github.com/RalphBacon/LGT8F328P-Arduino-Clone-Chip-ATMega328P?tab=readme-ov-file#6-simple-steps-to-get-a-lgt8f328p-based-board-running-at-32mhz">l'installation d'une librairie</a> spéciale dans le logiciel Arduino pour pourvoir les flasher. </p> <ol> <li>Télécharger <a href="https://github.com/LGTMCU/Larduino_HSP/archive/master.zip">l'archive de lalibrairie ici.</a> </li> <li>Extraire le dossier 'LGT' contenu dans l'archive dans le dossier 'hardware' qui se trouve lui même dans le dossier de vos sketches, par défaut :</li> </ol> <table> <thead> <tr> <th style="text-align: left;">OS</th> <th style="text-align: left;">Chemin</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;">Windows</td> <td style="text-align: left;">C:\Users\&lt;Username>\Documents\Arduino</td> </tr> <tr> <td style="text-align: left;">Mac OSX</td> <td style="text-align: left;">/Users/user/Documents/Arduino</td> </tr> <tr> <td style="text-align: left;">LINUX</td> <td style="text-align: left;">/home/&lt;Username>/sketchbook/</td> </tr> </tbody> </table> <ol start="3"> <li>Dans le logiciel Arduino, sélectionner la carte "LGT8F328P-LQFP32 MiniEVB" via le menu "Outils" &gt; "Type de carte" &gt; "Arduino AVR boards (from sketchbook)".</li> </ol> <p>Vous devriez maintenant pouvoir téléverser des croquis sur la carte. </p> <h2>SST39SF0X0</h2> <p>Les puces SST39SF0x0 ne nécessitent qu'une tension de 5V pour être programmée, et celle-ci est fournie par le Arduino directement depuis le port USB de l'ordinateur. </p> <h2>Connexions</h2> <p>Aucune connexion particulière n'est requise, il faut juste faire attention à insérer la puce avec le détrompeur vers l'extérieur du PCB (côté du levier du support ZIF).<br /> Avec le levier du support ZIF en position verticale, insérer la puce, puis abaisser le levier.<br /> Si on travaille avec une DIP-28 ou 24, on insérera la puce le plus bas possible sur le support (au niveau de l'inscription GND). </p> <p><img src="https://wiki.arthus.net/assets/TP32-595.jpg" alt="tp32-27c512" /></p> <h2>Opérations</h2> <ul> <li>Insérer la puce au format Dip-32 dans le support ZIF.</li> <li>Connecter le programmateur via un câble USB à un ordinateur équippé d'un logiciel de terminal série (<a href="https://teratermproject.github.io/index-en.html">TeraTerm</a> sous Windows, <a href="https://salsa.debian.org/minicom-team/minicom">Minicom</a> sous Linux).</li> <li>Lancer le logiciel de terminal et ouvrir la connexion série vers le périphérique série (ex: <code>COM3</code> sous Windows, <code>/dev/ttyACM0</code> sous Linux).</li> <li>Configurer la connexion avec les paramètres suivants : 115200 baud, 8 bits, no parity, 1 stop bit.<br /> Pour ce faire, <strong>Sous Windows</strong> dans Teraterm, menu 'Setup' &gt; 'Serial' puis entrer les bon paramètres.<br /> <img src="https://wiki.arthus.net/assets/teraterm-serial.jpg" alt="Config" /><br /> <strong>Sous Linux</strong> dans minicom, Ctrl-A P, puis touches E, L, V, Q. </li> <li>En appuyant ensuite sur n'importe quelle touche, un menu doit apparaître:<br /> <img src="https://wiki.arthus.net/assets/teraterm-tp.jpg" alt="Menu" /> </li> </ul> <p>Toutes les commandes prennent la forme <code>Xsssss eeeee</code> ou <code>X</code> correspond à une commande, <code>sssss</code> l'adresse de débutet <code>eeeee</code> l'adresse de fin (en héxadécimal). </p> <h3>Lecture d'une valeur sur l'eprom</h3> <p>Lancer une commande de lecture, par exemple <code>D0 ff</code> pour lire les valeurs des bits 0 jusqu'à 255. </p> <h3>Dump d'une eprom et transfert sur le disque dur</h3> <ol> <li>Lancer une commande de lecture, par exemple <code>R0 10000</code> pour dumper les valeurs de 0 jusqu'à 65536 (64Kio). </li> <li><strong>Sous Windows</strong> dans Teraterm :Lancer la réception des données en allant dans le menu 'File' &gt; 'Transfer' &gt; XMODEM &gt; Receive...<br /> <img src="https://wiki.arthus.net/assets/tt.gif" alt="Menu" /><br /> <strong>Sous Linux</strong> dans Minicom : Ctrl-A R, xmodem</li> <li>Sélectionner un emplacement pour sauver le fichier et valider.</li> </ol> <h3>Écriture d'une eprom</h3> <ol> <li>Lancer une commande d'écriture, par exemple <code>W0</code> pour écrire les données à partir de l'adresse 0.</li> <li><strong>Sous Windows</strong> dans Teraterm : Lancer l'envoi des données en allant dans le menu 'File' &gt; 'Transfer' &gt; XMODEM &gt; Send...<br /> <strong>Sous Linux</strong> dans Minicom : Ctrl-A S, xmodem</li> <li>Sélectionner un fichier à écrire et valider.</li> </ol> <h2>Linux: Minicom et problème de transferts xmodem</h2> <p>Sous Linux, en cas de problème avec minicom et le transfert xmodem, il faudra peut-être installer le paquet <code>lrzsz</code> et configurer la commande de transfert dans minicom : </p> <p>Pour ouvrir le menu de configuration : Ctrl-A O, Protocoles de transfert, touche C pour xmodem, Entrée, puis éditer la commande suivante : </p> <p><code>lrzsz-sx -b -X</code> </p> <p>Laisser tout le reste par défaut, appuyer sur la touche Entrée jusqu'au retour dans le menu, puis sélectionner <code>Enregistrer config. sous dfl</code> </p> <h2>Alimentation externe - exemple d'une EPROM 27C512</h2> <p>Un article spécifique pour les EPROM nécessitant une alimentation externe <a href="/?tommy-prom-32-27c512">est disponible ici.</a> </p> <h2>Références</h2> <p><a href="https://tomnisbet.github.io/TommyPROM/docs/tommyprom32-pcb#tommyprom32">https://tomnisbet.github.io/TommyPROM/docs/tommyprom32-pcb#tommyprom32</a><br /> <a href="https://ww1.microchip.com/downloads/en/DeviceDoc/20005022C.pdf">https://ww1.microchip.com/downloads/en/DeviceDoc/20005022C.pdf</a><br /> <a href="https://github.com/LGTMCU/Larduino_HSP">https://github.com/LGTMCU/Larduino_HSP</a><br /> <a href="https://github.com/RalphBacon/LGT8F328P-Arduino-Clone-Chip-ATMega328P?tab=readme-ov-file#6-simple-steps-to-get-a-lgt8f328p-based-board-running-at-32mhz">https://github.com/RalphBacon/LGT8F328P-Arduino-Clone-Chip-ATMega328P?tab=readme-ov-file#6-simple-steps-to-get-a-lgt8f328p-based-board-running-at-32mhz</a> </p> Thu, 26 Sep 2024 02:00:00 +0200 https://wiki.arthus.net/?tommy-prom-32 https://wiki.arthus.net/?tommy-prom-32 Flasher une ST M27C512 avec un TommyProm32 <h1>Flasher une ST M27C512 avec un TommyProm32</h1> <p>[toc]</p> <h2>Matériel nécessaire</h2> <ul> <li>Un <a href="https://github.com/TomNisbet/TommyPROM/">TommyProm32</a></li> <li>Une EPROM <a href="https://wiki.arthus.net/assets/m27c512.pdf">ST M27C512-45XF1 CDIP28 512 Kbit 64K x8</a> </li> <li>Deux cables Dupont</li> <li>Une alimentation capable de fournir du 6,25V et du 12,75V simultanément.</li> </ul> <h2>Utilisation générale</h2> <p>Une documentation plus générale <a href="?tommy-prom-32">est disponible ici</a> avec les instructions pour flasher le programmateur.</p> <h2>M27C512</h2> <p>La puce M27C512 nécessite deux tensions différentes pour être programmée . </p> <p>L'alimentation externe fournit du 12.75V à 'VPP Out 1' qui est routée sur la broche 22 correspondant à Vpp, et marquée O̅E̅ sur le PCB. </p> <p>Cette alimentation fournit aussi du 6.25V à 'VPP Out 2' qui est routée sur la broche 15 correspondant à Vcc, et marquée A17 sur le PCB. </p> <p>Notez que l'alimentation 5V du PCB est déconnectée de la puce en mode programmation. </p> <p>Deux jumpers doivent être placés aux emplacements J12 et J20 (en bas à droite du PCB) lorsque l'on souhaite effectuer des opérations d'écriture. </p> <p>Ils doivent être retirés pour les opérations de lecture. </p> <h2>Connexions</h2> <p>Il faut faire attention à insérer la puce avec le détrompeur vers l'extérieur du PCB (côté du levier du support ZIF). </p> <p><img src="https://wiki.arthus.net/assets/tp32-27c512.jpg" alt="tp32-27c512" /></p> <h2>Opérations</h2> <ul> <li>Insérer la puce au format Dip-28 dans le support ZIF.</li> <li>Connecter le programmateur via un câble USB à un ordinateur équippé d'un logiciel de terminal série (<a href="https://teratermproject.github.io/index-en.html">TeraTerm</a> sous Windows, <a href="https://salsa.debian.org/minicom-team/minicom">Minicom</a> sous Linux).</li> <li>Lancer le logiciel de terminal et ouvrir la connexion série vers le périphérique série (ex: <code>COM3</code> sous Windows, <code>/dev/ttyACM0</code> sous Linux).</li> <li>Configurer la connexion avec les paramètres suivants : 115200 baud, 8 bits, no parity, 1 stop bit.<br /> Pour ce faire, <strong>sous Windows</strong> dans Teraterm, menu 'Setup' &gt; 'Serial' puis entrer les bon paramètres.<br /> <img src="https://wiki.arthus.net/assets/teraterm-serial.jpg" alt="Config" /><br /> <strong>sous Linux</strong> dans minicom, Ctrl-A P, puis touches E, L, V, Q. </li> <li>En appuyant ensuite sur n'importe quelle touche, un menu doit apparaître:<br /> <img src="https://wiki.arthus.net/assets/teraterm-tp.jpg" alt="Menu" /> </li> </ul> <p>Toutes les commandes prennent la forme <code>Xsssss eeeee</code> ou <code>X</code> correspond à une commande, <code>sssss</code> l'adresse de débutet <code>eeeee</code> l'adresse de fin (en héxadécimal). </p> <h3>Lecture d'une valeur sur l'eprom</h3> <ol> <li>Enlever les jumpers aux emplacements J12 et J20</li> <li>Lancer une commande de lecture, par exemple <code>D0 ff</code> pour lire les valeurs des bits 0 jusqu'à 255.</li> </ol> <h3>Dump d'une eprom et transfert sur le disque dur</h3> <ol> <li>Enlever les jumpers aux emplacements J12 et J20</li> <li>Lancer une commande de lecture, par exemple <code>R0 10000</code> pour dumper les valeurs de 0 jusqu'à 65536 (64Kio). </li> <li><strong>sous Windows</strong> dans Teraterm :Lancer la réception des données en allant dans le menu 'File' &gt; 'Transfer' &gt; XMODEM &gt; Receive...<br /> <img src="https://wiki.arthus.net/assets/teraterm-xmod.jpg" alt="Menu" /><br /> <strong>sous Linux</strong> dans Minicom : Ctrl-A R, xmodem</li> <li>Sélectionner un emplacement pour sauver le fichier et valider.</li> </ol> <h3>Écriture d'une eprom</h3> <ol> <li>Placer les jumpers aux emplacements J12 et J20.</li> <li>Lancer une commande d'écriture, par exemple <code>W0</code> pour écrire les données à partir de l'adresse 0.</li> <li><strong>sous Windows</strong> dans Teraterm : Lancer l'envoi des données en allant dans le menu 'File' &gt; 'Transfer' &gt; XMODEM &gt; Send...<br /> <strong>sous Linux</strong> dans Minicom : Ctrl-A S, xmodem</li> <li>Sélectionner un fichier à écrire et valider.</li> </ol> <h2>Linux: Minicom et problème de transferts xmodem</h2> <p>Sous Linux, en cas de problème avec minicom et le transfert xmodem, il faudra peut-être installer le paquet <code>lrzsz</code> et configurer la commande de transfert dans minicom : </p> <p>Pour ouvrir le menu de configuration : Ctrl-A O, Protocoles de transfert, touche C pour xmodem, Entrée, puis éditer la commande suivante : </p> <p><code>lrzsz-sx -b -X</code> </p> <p>Laisser tout le reste par défaut, appuyer sur la touche Entrée jusqu'au retour dans le menu, puis sélectionner <code>Enregistrer config. sous dfl</code> </p> <h2>Références</h2> <p><a href="https://tomnisbet.github.io/TommyPROM/docs/tommyprom32-pcb#m27c256">https://tomnisbet.github.io/TommyPROM/docs/tommyprom32-pcb#m27c256</a><br /> <a href="https://media.digikey.com/pdf/data%20sheets/st%20microelectronics%20pdfs/m27c512.pdf">https://media.digikey.com/pdf/data%20sheets/st%20microelectronics%20pdfs/m27c512.pdf</a></p> Mon, 16 Sep 2024 02:00:00 +0200 https://wiki.arthus.net/?tommy-prom-32-27c512 https://wiki.arthus.net/?tommy-prom-32-27c512 Flasher ses roms Master System avec une Playstation <h1>Flasher ses roms Master System avec une Playstation</h1> <p>[toc]</p> <h2>Hein ?</h2> <p>En utilisant une cartouche de triche modifiée pour accueillir des circuits intégrés de type DIP-32 graçe à un support tulipe ou <a href="https://fr.wikipedia.org/wiki/Zero_insertion_force">ZIF</a>, on peut utiliser une Playstation équippée d'un port parallèle et d'un port série, exécutant le logiciel <a href="https://github.com/JonathanDotCel/unirom8_bootdisc_and_firmware_for_ps1">Unirom</a>, reliée à un ordinateur exécutant le logiciel <a href="https://github.com/JonathanDotCel/NOTPSXSerial">Nops</a>, pour flasher des modules mémoires de type AM29F0<em> ou SST39SF0</em> en variantes 10, 20 ou 40 (128 à 512KB). </p> <p>On peut ensuite utiliser un <a href="https://benryves.com/journal/3763154">cartmod</a> Master System pour exécuter une ROM fraichement flashée.</p> <h2>Matériel requis :</h2> <ul> <li>Une playstation équippée d'un port parrallèle ( SCPH-1000 à 7502)</li> <li>Une cartouche de triche Playstation type Game Hunter Lite/CD</li> <li>Un <a href="/?fabriquer_son_cable_usb_serie_pour_playstation">câble USB/série</a> pour la Playstation</li> <li>Une <a href="https://github.com/brad-lin/FreePSXBoot">carte mémoire avec Unirom installé</a></li> <li>Des modules de mémoire flash type AM29F0<em> ou SST39SF0</em> de 128 à 512 KB (1 à 4 Mb)</li> <li>Une cartouche Master Sytem <a href="https://benryves.com/journal/3763154">modifiée pour accueillir des modules mémoires modernes</a>.</li> </ul> <p>Pour la soudure :</p> <ul> <li>Un fer à souder</li> <li>De la tresse à dessouder</li> <li>Du flux et de l'étain</li> <li>Des supports tulipes ou zif DIP32</li> </ul> <h2>1. Création d'une carte mémoire Unirom pour la Playstation</h2> <p>Le logiciel qui permet de flasher des modules de mémoire côté Playstation s'appelle <a href="https://github.com/JonathanDotCel/unirom8_bootdisc_and_firmware_for_ps1">Unirom</a>. Ce logiciel peut être exécuté depuis un CD (sur une PSX équippée d'un modchip ou gràçe à l'astuce du <a href="http://www.playstation-gate.com/article-technique-le-swap-sur-playstation-1-lire-les-jeux-imports-61593345.html">swap CD</a>), depuis une cartouche de triche type AR ou depuis une carte mémoire <a href="https://github.com/brad-lin/FreePSXBoot">FreePSXboot</a>.<br /> Puisqu'on va changer régulièrement les modules mémoire de la cartouche de triche, et que le boot CD est un peu long, le plus simple est de créer une carte mémoire pour démarrer sous Unirom. </p> <p>Pour cela, il suffit de démarrer une première fois Unirom depuis le CD, avec une carte mémoire dans le port gauche de la PSX, puis de sélectionner l'option "Install-&gt;", puis "Install FreePSXboot to Memcard", puis "Auto Install". </p> <p><img src="https://wiki.arthus.net/assets/unirom_splash.jpg" alt="Splashscreen" /><br /> <img src="https://wiki.arthus.net/assets/unirom_install.jpg" alt="Install" /><br /> <img src="https://wiki.arthus.net/assets/unirom_install_freepsxboot.jpg" alt="Install Freepsxboot to mc" /><br /> <img src="https://wiki.arthus.net/assets/unirom_autoinstall.jpg" alt="auto-install" /> </p> <p>Une fois l'installation terminée, il faut démarrer la PSX sans CD, puis ouvrir le menu de gestion des cartes mémoires pour lancer Unirom.</p> <h2>2. Modification d'une cartouche de triche</h2> <p><img src="https://wiki.arthus.net/assets/game_hunter_cd_version.jpg" alt="Un game hunter version cd" /></p> <p>Les cartouches de triche type "Game Hunter" (et peut-être d'autres modèles) avec une coque transparente on l'avantage d'avoir un circuit imprimé permettant l'adaptation de plusieurs types de modules (DIP, TSOP et PLCC).<br /> Ici, on voit clairement les trous permettant l'insertion d'un DIP32, et le module de format TSOP déjà en place (un AT29C010 de 1Mb/128KB) : </p> <p><img src="https://wiki.arthus.net/assets/game_hunter_cd_version_AT29C010.jpg" alt="Game Hunter avec AT29C010" /></p> <p>Il suffit de dessouder le module mémoire présent sur la cartouche avec de la tresse en faisant bien attention à ne pas abimer les traces (pas comme moi :P), puis d'installer un support tulipe ou ZIF pour pouvoir facilement changer de module par la suite. </p> <p><img src="https://wiki.arthus.net/assets/game-hunter-lite-naked.jpg" alt="Game hunter sans mémoire" /><br /> <img src="https://wiki.arthus.net/assets/game_hunter_dip_socket.jpg" alt="Game hunter avec tulipe" /> </p> <h2>3. Flasher la rom</h2> <ul> <li>Démarrer Unirom sur la PSX, avec la cartouche de triche équippée d'un module flash vide.</li> <li>Brancher la PSX à l'ordi via le cable USB/Série</li> <li>Sur l'ordinateur équippé du logiciel Nops, lancer dans un terminal une commande du type :</li> </ul> <pre><code>nops /fast /rom ROM.SMS /dev/ttyUSBx</code></pre> <p>Adapter "ROM.SMS" et "/dev/ttyUSBx" en fonction de votre configuration et du nom de votre rom MS.<br /> Un message apparaît : </p> <pre><code>Hey hey hey hey! This doesn't look like a ROM. Maybe an .exe? Are you sure you want to flash this?</code></pre> <p>C'est normal, on ne flash pas une rom pour action replay Playstation mais une rom Master System! </p> <p>Nops vous demande de valider l'opération en appuyant sur la touche 'y'. </p> <p><img src="https://wiki.arthus.net/assets/unirom_force.jpg" alt="nops" /> </p> <p>Une fois le module mémoire flashé, le monter dans votre cartmod, et c'est parti!</p> <h2>Sources et références</h2> <p>PSX :</p> <p><a href="https://github.com/JonathanDotCel/unirom8_bootdisc_and_firmware_for_ps1">https://github.com/JonathanDotCel/unirom8_bootdisc_and_firmware_for_ps1</a><br /> <a href="https://github.com/JonathanDotCel/NOTPSXSerial">https://github.com/JonathanDotCel/NOTPSXSerial</a><br /> <a href="https://github.com/brad-lin/FreePSXBoot">https://github.com/brad-lin/FreePSXBoot</a><br /> <a href="https://wiki.arthus.net/?fabriquer_son_cable_usb_serie_pour_playstation">https://wiki.arthus.net/?fabriquer_son_cable_usb_serie_pour_playstation</a> </p> <p>Cartmod MS :</p> <p><a href="https://benryves.com/journal/3763154">https://benryves.com/journal/3763154</a><br /> <a href="https://web.archive.org/web/20141210222820/http://cgfm2.emuviews.com/smsflash.php">https://web.archive.org/web/20141210222820/http://cgfm2.emuviews.com/smsflash.php</a> </p> Tue, 21 May 2024 02:00:00 +0200 https://wiki.arthus.net/?master_system_cartmod https://wiki.arthus.net/?master_system_cartmod Network setup for KVM guests <h1>Network setup for KVM guests</h1> <p>[toc]</p> <h2>Host</h2> <h3>Bridge setup</h3> <p>Install 'bridge-utils' :</p> <pre><code>sudo apt-get install bridge-utils 16h 7m</code></pre> <p>Add bridge device :</p> <pre><code># 'br0' can be watherver you like. brctl addbr br0</code></pre> <p>Edit '/etc/network/interfaces' to add a bridge device and configure it on startup :</p> <pre><code># The loopback network interface auto lo iface lo inet loopback # The primary network interface # Change eth0 to refelct your actual if name allow-hotplug eth0 # Disable DHCP on physical device and use it on br0 instead iface eth0 inet manual # Bridge setup iface br0 inet dhcp bridge_stp off bridge_maxwait 0 bridge_fd 0 # Add physical interface and all vnetX virtual interfaces (in 0-99 range) bridge_ports eth0 regex vnet[0-9]?[0-9] # You can set the bridge device MAC address with #bridge_hw XX:XX:XX:XX:XX:XX</code></pre> <p>If your DHCP server is configured to deliver fixed IP adresses based on MAC, replace eth0's MAC with br0's on your router in order to give it the same local IP. </p> <h3>Virsh : use bridge for network</h3> <p>Create an xml file with the following content : <code>nano /tmp/br0.xml</code></p> <pre><code class="language-xml">&lt;network&gt; &lt;name&gt;br0&lt;/name&gt; &lt;forward mode="bridge"/&gt; &lt;bridge name="br0" /&gt; &lt;/network&gt;</code></pre> <p>Then set it as network :</p> <pre><code>virsh net-define /tmp/br0.xml</code></pre> <p>and start/autostart it :</p> <pre><code>virsh net-start br0 virsh net-autostart br0</code></pre> <p>You can also use 'virt-manager' and set your network via the XML editor. </p> <h3>(Optional) Add a route to your public IP range</h3> <pre><code># Edit to reflect your actual IP range and bridge device name sudo ip route add 0.0.0.0/32 dev br0</code></pre> <p>See <a href="#optional-configure-a-local-and-public-ip">Configure a local and public IP</a> below for the matching configuration on the guest. </p> <h2>Guest</h2> <h3>(Optional) Basic nftables ruleset</h3> <p>The following ruleset accepts SSH and HTTP(s) by default. </p> <p>In your '/etc/nftables.conf': </p> <pre><code class="language-bash">#!/usr/sbin/nft -f flush ruleset table inet firewall { chain inbound_ipv4 { # accepting ping (icmp-echo-request) for diagnostic purposes. # However, it also lets probes discover this host is alive. # This sample accepts them within a certain rate limit: # # icmp type echo-request limit rate 5/second accept } chain inbound_ipv6 { # accept neighbour discovery otherwise connectivity breaks # icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept # accepting ping (icmpv6-echo-request) for diagnostic purposes. # However, it also lets probes discover this host is alive. # This sample accepts them within a certain rate limit: # # icmpv6 type echo-request limit rate 5/second accept } chain inbound { # By default, drop all traffic unless it meets a filter # criteria specified by the rules that follow below. type filter hook input priority 0; policy drop; # Allow traffic from established and related packets, drop invalid ct state vmap { established : accept, related : accept, invalid : drop } # Allow loopback traffic. iifname lo accept # Jump to chain according to layer 3 protocol using a verdict map meta protocol vmap { ip : jump inbound_ipv4, ip6 : jump inbound_ipv6 } # Allow SSH on port TCP/22 and allow HTTP(S) TCP/80 and TCP/443 # for IPv4 and IPv6. tcp dport { 22, 80, 443} accept # Uncomment to enable logging of denied inbound traffic # log prefix "[nftables] Inbound Denied: " counter drop } chain forward { # Drop everything (assumes this device is not a router) type filter hook forward priority 0; policy drop; } # no need to define output chain, default policy is accept if undefined. }</code></pre> <p><em>source:<a href="https://wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server">Simple ruleset for a server</a></em></p> <h3>(Optional) Configure a local and public IP</h3> <p>Setup a guest with two network interfaces ; one for local IP and one for public IP.<br /> You should get two network interfaces in the host, <em>e.g ; enp1s0 and enp2s0</em>. </p> <p>In '/etc/network/interfaces' : </p> <pre><code>auto lo iface lo inet loopback # Use DHCP for enp1s0 to get a LAN IP auto enp1s0 iface enp1s0 inet dhcp # Set static public IP on enp2s0 auto enp2s0 iface enp2s0 inet static # Edit to fit your range address 0.0.0.1 broadcast 0.0.0.255 netmask 255.255.255.255</code></pre> <p>Then reboot the guest to apply these settings. </p> <h2>Links</h2> <h3>Sources</h3> <p><a href="https://wiki.debian.org/KVM#Setting_up_bridge_networking">https://wiki.debian.org/KVM#Setting_up_bridge_networking</a><br /> <a href="https://wiki.debian.org/BridgeNetworkConnections#Configuring_bridging_in_.2Fetc.2Fnetwork.2Finterfaces">https://wiki.debian.org/BridgeNetworkConnections#Configuring_bridging<em>in</em>.2Fetc.2Fnetwork.2Finterfaces</a><br /> <a href="https://wiki.debian.org/QEMU#Networking">https://wiki.debian.org/QEMU#Networking</a><br /> <a href="https://manpages.debian.org/bookworm/bridge-utils/bridge-utils-interfaces.5.en.html">https://manpages.debian.org/bookworm/bridge-utils/bridge-utils-interfaces.5.en.html</a><br /> <a href="https://wiki.libvirt.org/VirtualNetworking.html">https://wiki.libvirt.org/VirtualNetworking.html</a></p> <h3>Related discussions</h3> <p><a href="https://serverfault.com/questions/536114/libvirtd-getting-vps-to-use-existing-bridge">https://serverfault.com/questions/536114/libvirtd-getting-vps-to-use-existing-bridge</a><br /> <a href="https://unix.stackexchange.com/questions/245628/configure-public-ip-addresses-in-kvm-vms">https://unix.stackexchange.com/questions/245628/configure-public-ip-addresses-in-kvm-vms</a><br /> <a href="https://serverfault.com/questions/846834/how-to-assign-public-ip-to-kvm-virtual-machine-from-29-subnet#846986">https://serverfault.com/questions/846834/how-to-assign-public-ip-to-kvm-virtual-machine-from-29-subnet#846986</a><br /> <a href="https://serverfault.com/questions/461070/assign-public-and-private-ip-addresses-for-a-kvm-guest">https://serverfault.com/questions/461070/assign-public-and-private-ip-addresses-for-a-kvm-guest</a></p> Fri, 12 Apr 2024 02:00:00 +0200 https://wiki.arthus.net/?kvm-net-bridge https://wiki.arthus.net/?kvm-net-bridge GNU/Linux - Numériser une VHS SECAM/PAL avec le son et l'image sous Linux avec un Dazzle DVC90 <h1>Numériser une VHS SECAM/PAL avec le son et l'image sous Linux avec un Dazzle DVC90</h1> <h2>Résumé</h2> <p>Bien que ce périphérique soit bien supporté sous Linux, la plupart des logiciels de capture (guvcview, obs, xawtv...) auront du mal à capturer le son de vos sources.<br /> Il est pourtant possible d'enregistrer l'image <strong>et</strong> le son avec VLC et quelques options spécifiques V4L2. </p> <p>Cette solution devrait s'appliquer à toute la famille des Dazzle DVC80, DVC100, DVC110, etc. </p> <h2>Le périphérique</h2> <p>Le périphérique est un Pinnacle Dazzle DVC90 et utilise le pilote <a href="https://linuxtv.org/wiki/index.php/Em28xx_devices">em28xx</a>. </p> <h3>lsusb</h3> <pre><code>Bus 001 Device 007: ID 2304:0207 Pinnacle Systems, Inc. Dazzle DVC90 Video Device</code></pre> <h3>dmesg</h3> <pre><code> kernel: usb 1-1: new high-speed USB device number 127 using xhci_hcd kernel: usb 1-1: New USB device found, idVendor=2304, idProduct=0207, bcdDevice= 1.00 kernel: usb 1-1: New USB device strings: Mfr=2, Product=1, SerialNumber=0 kernel: usb 1-1: Product: DVC90 kernel: usb 1-1: Manufacturer: Pinnacle Systems GmbH mtp-probe[414253]: checking bus 1, device 127: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1" mtp-probe[414253]: bus: 1, device: 127 was not an MTP device kernel: em28xx 1-1:1.0: New device Pinnacle Systems GmbH DVC90 @ 480 Mbps (2304:0207, interface 0, class 0) kernel: em28xx 1-1:1.0: Video interface 0 found: bulk isoc kernel: em28xx 1-1:1.0: chip ID is em2710/2820 kernel: em28xx 1-1:1.0: EEPROM ID = 1a eb 67 95, EEPROM hash = 0x3cac3c11 kernel: em28xx 1-1:1.0: EEPROM info: kernel: em28xx 1-1:1.0: AC97 audio (5 sample rates) kernel: em28xx 1-1:1.0: 300mA max power kernel: em28xx 1-1:1.0: Table at offset 0x06, strings=0x0e98, 0x2e6a, 0x0000 kernel: em28xx 1-1:1.0: Identified as Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U (card=9) kernel: em28xx 1-1:1.0: analog set to isoc mode. kernel: em28xx 1-1:1.1: audio device (2304:0207): interface 1, class 1 kernel: em28xx 1-1:1.2: audio device (2304:0207): interface 2, class 1 kernel: usbcore: registered new interface driver em28xx kernel: em28xx 1-1:1.0: Registering V4L2 extension kernel: usbcore: registered new interface driver snd-usb-audio mtp-probe[414330]: checking bus 1, device 127: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1" mtp-probe[414330]: bus: 1, device: 127 was not an MTP device (udev-worker)[414336]: controlC2: Process '/usr/bin/alsactl restore 2' failed with exit code 99. systemd[1705]: Reached target Sound Card. kernel: saa7115 7-0025: saa7113 found @ 0x4a (1-1:1.0) kernel: em28xx 1-1:1.0: Config register raw data: 0x12 kernel: em28xx 1-1:1.0: AC97 vendor ID = 0xffffffff kernel: em28xx 1-1:1.0: AC97 features = 0x6a90 kernel: em28xx 1-1:1.0: Empia 202 AC97 audio processor detected kernel: em28xx 1-1:1.0: V4L2 video device registered as video1 kernel: em28xx 1-1:1.0: V4L2 extension successfully initialized kernel: em28xx: Registered (Em28xx v4l2 Extension) extension</code></pre> <h3>/proc/asound/cards</h3> <pre><code> 2 [DVC90 ]: USB-Audio - DVC90 Pinnacle Systems GmbH DVC90 at usb-0000:00:14.0-1, high speed </code></pre> <h2>Obtenir de la vidéo et de l'audio dans VLC</h2> <ol> <li>Dans VLC, choisir l'option "Convertir/Enregistrer" dans le menu "Média".</li> <li>Dans la nouvelle fenêtre, passer dans l'onglet "Périphérique de capture" tab, choisir "/dev/video1" comme périphérique vidéo (à adapter en fonction de votre configuration).</li> <li>Choisir "hw:2,0" comme périphérique audio.</li> <li>Choisir "SECAM L" pour du SECAM en france.</li> <li>Cocher "Montrer plus d'options" en bas à gauche de la fenêtre.</li> <li>Dans le champ "modifier les options", utiliser la ligne suivante<pre><code># La doc de ces options est dispo ici: https://wiki.videolan.org/Documentation:Modules/v4l2/ # Changer v4l2-input a 0 pour du composite, 1 pour du s-video. # Changer DVC90 to DVC80/100/110 en fonction de votre peripherique. # Changer v4l2-standard et v4l2-fps en fonction de la source. :v4l2-standard=SECAM :input-slave=alsa://plughw:DVC90 :v4l2-input=1 :v4l2-width=720 :v4l2-height=576 :v4l2-fps=25 :no-v4l2-audio-mute :live-caching=300</code></pre> </li> <li>Cliquer sur le boutton "Convertir/Enregistrer"</li> <li>Cocher "Afficher le flux de sortie" et "Désinterlacer", éditer les options des codecs si besoin, et choisir un fichier de sortie.</li> <li>Cliquer sur "Démarrer".</li> </ol> <p>English version: <a href="https://gist.github.com/ABelliqueux/f5eef886b1fe09e78f12b590b119c1ec">https://gist.github.com/ABelliqueux/f5eef886b1fe09e78f12b590b119c1ec</a><br /> Source: <a href="https://debian-facile.org/viewtopic.php?id=25505">https://debian-facile.org/viewtopic.php?id=25505</a> </p> Sat, 22 Apr 2023 02:00:00 +0200 https://wiki.arthus.net/?numeriser_SECAM_PAL_VHS_Dazzle_DVC90_Linux https://wiki.arthus.net/?numeriser_SECAM_PAL_VHS_Dazzle_DVC90_Linux GNU/Linux - Udev & systemd - Running a graphic environment when a USB device is plugged in <h1>GNU/Linux - Udev &amp; systemd - Running a graphic environment when a USB device is plugged in</h1> <h2>Summary :</h2> <p>At a GNU/Linux console prompt, no GUI. When a USB device of type <a href="https://en.wikipedia.org/wiki/Human_interface_device">HID</a> (keyboard/mouse mainly) is plugged in, we want the X server to start and launch VLC's graphical interface, fullscreen, no borders. When this device is removed, VLC is shut down and the X server too, and we end up back at the console prompt.</p> <h3>Proposed solution:</h3> <ol> <li><a href="https://wiki.archlinux.org/title/Udev">Udev</a> rules are triggered when the USB device is plugged/unplugged to create a file in '/tmp' named '.vlc_gui'.</li> <li>A systemd <a href="https://wiki.archlinux.org/title/Systemd/User">user</a> service starts a script on startup.</li> <li>This script uses <a href="https://man.archlinux.org/man/inotifywait.1">inotifywait</a> to monitor a file's creation/deletion in the '/tmp' folder, and act accordingly;</li> <li>Start/close a minimal graphical environment with <a href="http://openbox.org/">openbox</a> running <a href="https://videolan.org">VLC</a>.</li> </ol> <h2>1. Udev configuration</h2> <h3>Run script on USB HID (mouse/kb) connect</h3> <p>We want a rule that triggers when a device has SUBSYSTEM=="usb" and DRIVER=="usbhid". </p> <p>In '/etc/udev/rules.d/01-vlc_gui.rules' : </p> <pre><code># On plug ACTION=="add" SUBSYSTEM=="usb", DRIVER=="usbhid", RUN+="/usr/bin/touch /tmp/.vlc_gui" # On un-plug ACTION=="remove" SUBSYSTEM=="usb", RUN+="/usr/bin/rm -f /tmp/.vlc_gui"</code></pre> <p>The rules above create a '.vlc_gui' file in '/tmp' when a usbhid device is plugged in, and removes it when unplugged.</p> <h3>Change read permissions on tty7</h3> <p>By default, permissions on '/dev/tty*' are 0620 (<code>crw--w----</code>). So members of group <code>tty</code> can write, but not read to ttys. This will be a problem for the X server, so we need to change those permissions to have read writes for our group too. </p> <p>Let's change the permissions on the tty that we need to 0660 (<code>crw-rw----</code>) so that we can run our X session on it. </p> <p>Inspect how udev sees your TTY (tty7 here): </p> <p><code>udevadm info --attribute-walk --path=/sys/class/tty/tty7</code></p> <pre><code>looking at device '/devices/virtual/tty/tty7': KERNEL=="tty7" SUBSYSTEM=="tty" DRIVER=="" ATTR{power/control}=="auto" ATTR{power/runtime_active_time}=="0" ATTR{power/runtime_status}=="unsupported" ATTR{power/runtime_suspended_time}=="0</code></pre> <p>So we want a rule that matches 'KERNEL=="tty7"' and 'SUBSYSTEM=="tty"' and set it to mode '0660': </p> <p><code>SUBSYSTEM=="tty", KERNEL=="tty7", MODE:="0660"</code></p> <p>Notice the <a href="https://www.freedesktop.org/software/systemd/man/udev.html#Operators">immutable operator</a> ":=" for "MODE"; it makes shure this won't be changed by another rule. </p> <p><a href="https://forums.opensuse.org/t/udev-rules-priority-disallow-change-by-other-rules-with-operator/100210">Udev rules order read</a> </p> <p>Test which rules are triggered by a specific device with : </p> <p><code>udevadm test /class/tty/tty7</code></p> <p>Reload and apply the new rules with : </p> <pre><code>udevadm control --reload-rules udevadm trigger</code></pre> <p>Of course, don't forget to add your user to the 'tty' group :</p> <p><code>sudo adduser USERNAME tty</code></p> <p>On some system, you might have to use usermod :</p> <p><code>sudo usermod -a -G tty USERNAME</code></p> <p>then log out/in and check with <code>groups</code> that 'tty' appears in the listed groups. </p> <h2>2. Systemd user unit</h2> <p>We can create <a href="https://wiki.archlinux.org/title/systemd/User">user units</a> in '~/.config/systemd/user/', e.g : </p> <p><code>nano ~/.config/systemd/user/vlc_gui.service</code></p> <pre><code class="language-yaml">[Unit] Description=VLC GUI launcher service [Service] # %h specifier resolves to user home (~ equivalent) ExecStart="%h"/vlc_gui.sh Restart=always [Install] WantedBy=default.target</code></pre> <p>Reload the units with <code>systemctl --user daemon-reload</code><br /> and start/enable the service with<br /> <code>systemctl --user start vlc_gui.service</code> / <code>systemctl --user enable vlc_gui.service</code>. </p> <p>More about systemd specifiers:<br /> <a href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers">https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers</a> </p> <h3>Starting a user unit as root</h3> <p>If running <a href="https://github.com/systemd/systemd/blob/28795f2c138203fb700fc394f0937708af886116/NEWS#L2809">systemd version &gt;= 248 (2021-03)</a>, you can <a href="https://www.freedesktop.org/software/systemd/man/systemctl.html#-M">start a user unit as root</a>, i.e ;<br /> using <code>sudo systemctl</code> or in a root shell, with e.g: </p> <p><code>sudo systemctl --user --machine USERNAME@ start foo.service</code></p> <p>On prior versions, you have to use either<br /> <code>su - USERNAME -c 'systemctl --user start foo.service'</code> or<br /> <code>runuser -l USERNAME -c 'systemctl --user start foo.service'</code> instead. </p> <h2>3. inotifywait : watch for a file's creation/deletion</h2> <h3>Install the tool :</h3> <p><code>sudo apt-get install inotify-tools</code></p> <h3>Create the script :</h3> <p>In '~/vlc_gui.sh' :</p> <pre><code class="language-bash">#!/usr/bin/env bash inotifywait -m /tmp -e create -e delete | while read directory action file; do if [[ "$file" == ".vlc_gui" ]]; then if [[ "$action" == "CREATE" ]]; then echo "Starting VLC GUI." # Start X environment on tty7 DISPLAY=:0 startx -- vt7 &amp; elif [[ "$action" == "DELETE" ]]; then echo "Killing VLC GUI" pkill vlc fi fi done</code></pre> <p>Don't forget to set execution bit : <code>sudo chmod +x ~/vlc_gui.sh</code></p> <h2>4. Minimal X environment &amp; Launching VLC</h2> <p>Install the following packages : </p> <p><code>sudo apt-get install -y --no-install-recommends --no-install-suggests xinit xserver-xorg xserver-xorg-core xserver-xorg-input-evdev xserver-xorg-input-kbd openbox feh</code></p> <h3>Xinit config</h3> <p>We start the X environment with <code>startx</code>, which sources "~/.xinitrc".<br /> Let's start openbox session there. </p> <p><code>cp /etc/X11/xinit/xinitrc ~/.xinitrc</code></p> <p>Then in "~/.xinitrc" : </p> <pre><code class="language-bash">#!/bin/sh # /etc/X11/xinit/xinitrc # # global xinitrc file, used by all X sessions started by xinit (startx) # invoke global X session script . /etc/X11/Xsession exec openbox-session</code></pre> <p>Set execution bit : </p> <p><code>sudo chmod +x ~/.xinitrc</code></p> <h3>Openbox configuration</h3> <p>Now Openbox config files are in '~/.config/openbox' and there are two of them :</p> <h4>autostart.sh</h4> <p>In '~/.config/openbox/autostart.sh' :</p> <pre><code class="language-bash">#!/bin/bash # Exit openbox when VLC is closed vlc --vout=gles2 &amp;&amp; openbox --exit # on rpi with 3d kms driver, can be --vout=drm_vout </code></pre> <p>Set execution bit : </p> <p><code>sudo chmod +x ~/.config/openbox/autostart.sh</code></p> <h4>rc.xml</h4> <p><code>cp /etc/xdg/openbox/rc.xml ~/.config/openbox/</code></p> <p>We want the VLC gui launching fullscreen, with no window decoration. In openbox's <a href="http://openbox.org/wiki/Help:Applications">&lt;applications></a> section of '~/.config/openbox/rc.xml', l.656, add: </p> <pre><code class="language-markup"> &lt;application name="vlc" role="vlc-main"&gt; &lt;decor&gt;no&lt;/decor&gt; &lt;maximized&gt;yes&lt;/maximized&gt; &lt;/application&gt;</code></pre> <h2>Troubleshooting</h2> <h3>Udev rules</h3> <p>You can increase udev's log verbosity with <code>sudo udevadm control --log-priority=debug</code><br /> then run <code>journalctl -f</code> to see if an error message comes up when plugging/unplugging the USB HID.</p> <h3>Xserver</h3> <p>You can see what's going on by launching <code>journalctl -f</code> in a SSH session, then plug/unplug the USB HID.<br /> If you encounter an error with the X server complaining about permission to tty7 like this </p> <pre><code>(EE) xf86OpenConsole: Cannot open virtual console 7 (Permission denied)</code></pre> <p>try rebooting. </p> <h3>Slow mouse cursor</h3> <p>If you experience laggy mouse cursor movements, you can try adding <code>usbhid.mousepoll=0</code> to '/boot/cmdline.txt'.</p> <p>Other values you might want to try are :</p> <table> <thead> <tr> <th style="text-align: center;">value</th> <th style="text-align: center;">speed</th> </tr> </thead> <tbody> <tr> <td style="text-align: center;">0</td> <td style="text-align: center;">device request</td> </tr> <tr> <td style="text-align: center;">X</td> <td style="text-align: center;">1000/X Hz</td> </tr> </tbody> </table> <p>source: <a href="https://peppe8o.com/fixing-slow-mouse-with-raspberry-pi-os/">https://peppe8o.com/fixing-slow-mouse-with-raspberry-pi-os/</a> </p> Thu, 19 Jan 2023 01:00:00 +0100 https://wiki.arthus.net/?UDEV_systemd_start_x_environment_usb_plugging https://wiki.arthus.net/?UDEV_systemd_start_x_environment_usb_plugging Rpi config.txt - Safe overclocking values <h1>Rpi config.txt - Safe overclocking values</h1> <p>To get a little boost out of your RPI while being conservative for applications where you need reliability and avoid data corruption, I found these values to do the job. </p> <p>This goes in '/boot/config.txt' : </p> <pre><code># SD card reader OC (expect 20% rio improvement) # Samsung Pro/Evo+ is recommended # default value : 50 # value needs to be an int divisor of core_freq # NEEDS A UHS-1/Class10 SD CARD ! # dtparam=sd_overclock=100 # To check the sd card clock once booted : cat /sys/kernel/debug/mmc0/ios | grep 'actual clock' [pi4] # Run as fast as firmware / board allows arm_boost=1 dtoverlay=disable-bt dtoverlay=vc4-kms-v3d max_framebuffers=2 # Apply to rpi3, rpi3+, cm3 [pi3] # Safe OC values # gpu_freq : Sets core_freq, h264_freq, isp_freq, v3d_freq and hevc_freq together # default values : # arm_freq 1200 # gpu_freq 400 # sdram_freq 450 arm_freq=1300 gpu_freq=462 sdram_freq=500 over_voltage=3 # NEEDS A UHS-1/Class10 SD CARD ! dtparam=sd_overclock=66 # Disable bluetooth dtoverlay=disable-bt # Enable DRM VC4 V3D driver dtoverlay=vc4-kms-v3d max_framebuffers=2 # Override OC values for 3+ models [pi3+] # Defaults values : # arm_freq 1400 # gpu_freq 400 # sdram_freq 500 arm_freq=1500 sdram_freq=550 [pi1] # default values # arm_freq 700 # gpu_freq 250 # sdram_freq 400 arm_freq=1000 gpu_freq=400 sdram_freq=500 over_voltage=6 [all] # This much is needed for 1080p playback gpu_mem=64 # Force HDMI Full HD hdmi_group=1 hdmi_mode=16 # fullHD@60 # Avoid SD card corruption boot_delay=1 # Disable rainbow splash and power warnings avoid_warnings=1 disable_splash=1</code></pre> <h2>Some links</h2> <ul> <li>RPI's official doc on overclocking : <a href="https://www.raspberrypi.com/documentation/computers/config_txt.html#overclocking-options">https://www.raspberrypi.com/documentation/computers/config_txt.html#overclocking-options</a></li> <li>SD overclocking guide : <a href="https://www.jeffgeerling.com/blog/2016/how-overclock-microsd-card-reader-on-raspberry-pi-3">https://www.jeffgeerling.com/blog/2016/how-overclock-microsd-card-reader-on-raspberry-pi-3</a></li> <li>SD card benchmarks : <a href="https://www.pidramble.com/wiki/benchmarks/microsd-cards">https://www.pidramble.com/wiki/benchmarks/microsd-cards</a></li> </ul> Thu, 12 Jan 2023 01:00:00 +0100 https://wiki.arthus.net/?Rpi_config_txt_safe_oc_values https://wiki.arthus.net/?Rpi_config_txt_safe_oc_values Rpi 3A+/3B+/4B wifi - BCM4345 and CTRL-EVENT-ASSOC-REJECT <h1>Rpi 3A+/3B+/4B wifi - BCM4345 and CTRL-EVENT-ASSOC-REJECT when using handshake offloading</h1> <p>I encountered an issue with the wifi on my 3A+/4B not willing to connect to my AP, while my 3B was perfectly happy with it. Turns out it's a driver issue with 'brcmfmac' and the BCM4345 chipset that's in newer RPI models.<br /> I'm using <strong>raspios bullseye (2022-09-22-raspios-bullseye-arm64-lite.img.xz)</strong>. </p> <p><code>wpa_supplicant</code> kept insisting that <code>CTRL-EVENT-ASSOC-REJECT</code>, i.e: </p> <pre><code>sudo wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0 Successfully initialized wpa_supplicant wlan0: Trying to associate with **:**:**:**:**:** (SSID='foo' freq=2417 MHz) wlan0: CTRL-EVENT-ASSOC-REJECT bssid=**:**:**:**:**:** status_code=16 wlan0: Trying to associate with **:**:**:**:**:** (SSID='foo' freq=2417 MHz) wlan0: CTRL-EVENT-ASSOC-REJECT bssid=**:**:**:**:**:** status_code=16 wlan0: Trying to associate with **:**:**:**:**:** (SSID='foo' freq=2417 MHz) wlan0: CTRL-EVENT-ASSOC-REJECT bssid=**:**:**:**:**:** status_code=16 [etc]</code></pre> <h2>Why is this happening ?</h2> <p>After a <strong>LOT</strong> of troubleshooting and tests, and web searching, I stumbled upon several interesting pages and bug reports : </p> <ul> <li>A wiki page in <a href="https://iwd.wiki.kernel.org/start">IWD</a>'s wiki kernel.org : <a href="https://iwd.wiki.kernel.org/offloading">https://iwd.wiki.kernel.org/offloading</a>- <a href="https://web.archive.org/web/20221129112439/https://iwd.wiki.kernel.org/offloading">mirror</a> with an explanation as to why this happens</li> <li>A bug report linked in the page above : <a href="https://lore.kernel.org/linux-wireless/e1ff2a8eef465eaa76e8d00503d04e0fdd61a878.camel@gmail.com/">https://lore.kernel.org/linux-wireless/e1ff2a8eef465eaa76e8d00503d04e0fdd61a878.camel@gmail.com/</a> - <a href="https://web.archive.org/web/20220704011121/https://lore.kernel.org/linux-wireless/e1ff2a8eef465eaa76e8d00503d04e0fdd61a878.camel@gmail.com/">mirror</a> </li> <li>Another bug report on launchpad.net <a href="https://bugs.launchpad.net/raspbian/+bug/1929746">https://bugs.launchpad.net/raspbian/+bug/1929746</a> - <a href="https://web.archive.org/web/20230107122421/https://bugs.launchpad.net/raspbian/%20bug/1929746">mirror</a></li> </ul> <p>From the wiki linked above :</p> <blockquote> <p>Certain drivers support offloading the 4-way handshake as well as SAE/WPA3 into the firmware. For drivers which do not support user space driven Authenticate/Associate frames this is the only way to enable features such as SAE/WPA3 or Fast Transition roaming. Handshake offloading (both WPA2 and WPA3) is enabled in IWD by default for drivers which advertise support. The driver support, however, can be disabled on brcmfmac which will be discussed further. Handshake offloading has only been tested on the brcmfmac driver, and this wiki page assumes this driver is being used. </p> </blockquote> <blockquote> <p>If you are using brcmfmac and are experiencing problems such as not being able to connect to a network which you previously could, you may want to disable handshake offloading.</p> </blockquote> <blockquote> <p>The brcmfmac driver has a module parameter called 'feature_disable'. It expects a hex value (bitmask) where each bit corresponds to a feature [...]. The features we care about here are 'SAE' and 'FWSUP'. These features (when enabled) are listed in /sys/kernel/debug/ieee80211/<phy>/features so you can first see if your card even supports these before trying to debug further. </p> </blockquote> <p>On the <strong>rpi 3A+ and 4B</strong>, here'is what <code>/sys/kernel/debug/ieee80211/&lt;phy&gt;/features</code> gives us : </p> <pre><code># cat /sys/kernel/debug/ieee80211/phy0/features Features: 001428d6 MCHAN PNO P2P TDLS SCAN_RANDOM_MAC MFP FWSUP DOT11H FWAUTH Quirks: 00000000</code></pre> <blockquote> <p>To turn off offloading you need to remove the brcmfmac module, then reinsert it with the feature_disable option:</p> </blockquote> <pre><code>sudo rmmod brcmfmac sudo modprobe brcmfmac feature_disable=0x82000</code></pre> <blockquote> <p>This will disable both SAE (0x80000) and FWSUP (0x02000). You could disable just one, but this is not suggested due to a bug which prevents EAPoL frames from being forwarded after offloading is used for the first time.</p> </blockquote> <h2>The workaround</h2> <p>You can resolve the issue by using only <code>feature_disable=0x02000</code> if you're sure you won't ever have a WPA3/SAE AP around, but due to the bug mentionned above, you might want to be on the safe side and disable SAE as well while this bug exists.</p> <pre><code>sudo rmmod brcmfmac sudo modprobe brcmfmac roamoff=1 feature_disable=0x82000</code></pre> <h2>Driver options on boot</h2> <p>If that fixes things for you and you want to make this setting persistent, you can create a file with these options in '/etc/modprobe.d', e.g ; </p> <pre><code>echo 'options brcmfmac roamoff=1 feature_disable=0x82000' | sudo tee /etc/modprobe.d/brcmfmac.conf</code></pre> <p>This will make sure the settings are applied when the driver loads. </p> <p>The 3A+/3B+/4B are equipped with a BCM4345 chipset so this should solve wifi issues with those models. </p> Sat, 07 Jan 2023 01:00:00 +0100 https://wiki.arthus.net/?Rpi_wifi_-_BCM4345_and_CTRL-EVENT-ASSOC-REJECT https://wiki.arthus.net/?Rpi_wifi_-_BCM4345_and_CTRL-EVENT-ASSOC-REJECT