308 lines
9.2 KiB
TeX
308 lines
9.2 KiB
TeX
\chapter{Hardware}
|
|
\label{chap:hardware}
|
|
|
|
% -----------------------------------------------------------
|
|
\section{Joystick}\index{joystick}
|
|
|
|
La manette de jeu est un périphérique que j'affectionne particulièrement.
|
|
|
|
\begin{verbatim}
|
|
int foo, joy_fd;
|
|
struct js_event js;
|
|
|
|
joy_fd = open(joy_device , O_RDONLY);
|
|
foo = read(joy_fd, &js, sizeof(struct js_event));
|
|
\end{verbatim}
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
\section{Diagnostics}
|
|
|
|
Quand les choses ne se passent pas comme prévu, quand il
|
|
y a des accrocs dans le plan, que le résultat n'est
|
|
qu'une video totalement noire de 17 minutes, que des
|
|
octets incongrus arrivent depuis l'Arduino.
|
|
dmesg, lscpu, lshw, lsusb, lspci\dots
|
|
|
|
% -----------------------------------------------------------
|
|
% new: Fri Sep 22 11:13:36 UTC 2023
|
|
|
|
\subsection{lshw} \index{lshw}
|
|
|
|
\begin{quote}
|
|
lshw is a small tool to extract detailed information on the hardware
|
|
configuration of the machine. It can report exact memory configuration,
|
|
firmware version, mainboard configuration, CPU version and speed, cache
|
|
configuration, bus speed, etc. on DMI-capable x86 or IA-64 systems and
|
|
on some PowerPC machines (PowerMac G4 is known to work).
|
|
\end{quote}
|
|
|
|
% -----------------------------------------------------------
|
|
\subsection{lscpu} \index{lscpu}
|
|
|
|
\begin{verbatim}
|
|
tth@redlady:~/Desktop$ lscpu --all --extended
|
|
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ
|
|
0 0 0 0 0:0:0:0 yes 3800.0000 1600.0000
|
|
1 0 0 1 1:1:1:0 yes 3800.0000 1600.0000
|
|
2 0 0 2 2:2:2:0 yes 3800.0000 1600.0000
|
|
3 0 0 3 3:3:3:0 yes 3800.0000 1600.0000
|
|
tth@redlady:~/Desktop$
|
|
\end{verbatim}
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
\section{Ports série}
|
|
\index{rs232} \label{rs232}
|
|
|
|
\begin{quote}
|
|
RS-232 (parfois appelée EIA RS-232, EIA 232 ou TIA 232) est
|
|
une norme standardisant une voie de communication de type série.
|
|
Le standard RS-232 recouvre plusieurs autres standards~:
|
|
les recommandations UIT-T V.24 (définition des circuits)
|
|
et V.28 (caractéristiques électriques),
|
|
ainsi que la norme ISO 2110 pour la connectique.
|
|
\end{quote}
|
|
|
|
Comment détecter si un \textit{device} correspond bien
|
|
à un port série ? Une fois de plus, la réponse passe
|
|
par un \textsl{ioctl}\index{ioctl}.
|
|
Même si il est bien caché.
|
|
|
|
\begin{lstlisting}[language=C]
|
|
#include <stdio.h>
|
|
#include <fcntl.h>
|
|
#include <termios.h>
|
|
|
|
#define TTY "/dev/ttyS18"
|
|
|
|
int main(void) {
|
|
int fd = open(TTY, O_RDWR | O_NOCTTY);
|
|
if (fd < 0) {
|
|
perror("open " TTY);
|
|
return 1;
|
|
}
|
|
|
|
struct termios tio;
|
|
if (tcgetattr(fd, &tio)) {
|
|
perror("tcgetattr " TTY);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
\end{lstlisting}
|
|
|
|
En effet, \texttt{tcgetattr(3)} va aller lire le paramétrage
|
|
du port associé au descripteur de fichier \texttt{fd}
|
|
par l'intermédiaire d'un ioctl (qui aurait pû prévoir ?)
|
|
que nous détaillerons un de ces jours.
|
|
|
|
Et la question qui, je le sens, va venir~: « à quoi peut bien
|
|
servir un port série ? » appelle un réponse presque évidente~:
|
|
« à plusieurs choses ». Une petite liste~:
|
|
Connecter un Minitel\index{MINITEL}
|
|
pour dialoguer avec Ulla Trentsixquinze ? Brancher un
|
|
Sportster 14400 pour retrouver Fidonet\index{Fidonet} ?
|
|
Discuter avec un équipement avionnique ? Rediriger
|
|
l'impression d'un MSX\index{MSX} ou d'un Alice 32
|
|
vers Cups\index{cups} ?
|
|
|
|
Les possibilités sont infinies. C'est votre imagination qui
|
|
est la limite\footnote{Comme à peu près tout dans la vie.}
|
|
|
|
% -----------------------------------------------------------
|
|
\section{Ports \textbf{//}} \label{portparallele}
|
|
\index{port //}
|
|
|
|
% http://people.redhat.com/twaugh/parport/html/x623.html
|
|
|
|
périphérique \texttt{/dev/parport}
|
|
|
|
Question: comment faire du \textsl{bitbanging} ?
|
|
|
|
% -----------------------------------------------------------
|
|
\section{USB} \index{USB} \label{USB}
|
|
|
|
Universal Serial Bus, existe en trois taille.
|
|
|
|
\begin{verbatim}
|
|
tth@redlady:~/Devel/TetaTricks$ lsusb
|
|
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
|
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
|
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
|
|
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
|
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
|
|
Bus 002 Device 006: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
|
|
Bus 002 Device 002: ID 0461:4e6f Primax Electronics, Ltd
|
|
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
|
|
\end{verbatim}
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
\section{Disques durs}
|
|
|
|
Iozone ? Bonnie ? Smart\index{smart} ? UUID\index{uuid} ?
|
|
Ddrescue\index{ddrescue} ?
|
|
|
|
\subsection{blkid \& lsblk}
|
|
|
|
À mi-chemin entre le matériel et le système, la commande
|
|
\texttt{blkid}\index{blkid} affiche quelques informations
|
|
sur les périphériques blocs
|
|
et surtout les partitions qu'ils contiennent~:
|
|
|
|
\begin{itemize}
|
|
\item Périphérique dans \texttt{/dev/}
|
|
\item UUID XXX\index{XXX}
|
|
\item Type de la partition
|
|
\item Label textuel
|
|
\item PARTUID
|
|
\end{itemize}
|
|
|
|
|
|
\vspace{1em}
|
|
|
|
Quand à \texttt{lsblk}\index{lsblk}, elle affiche
|
|
le même genre d'information, mais en plus joli
|
|
(j'ai utilisé l'option \texttt{-i} pour que le résultat
|
|
passe mieux à l'impression)~:
|
|
|
|
\begin{verbatim}
|
|
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
|
|
sda 8:0 0 232.9G 0 disk
|
|
+-sda1 8:1 0 18.6G 0 part /
|
|
+-sda2 8:2 0 3.8G 0 part [SWAP]
|
|
+-sda3 8:3 0 488M 0 part /boot
|
|
+-sda4 8:4 0 210G 0 part /home
|
|
\end{verbatim}
|
|
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
\subsection{Smart}\index{smart}
|
|
|
|
Self-Monitoring, Analysis and Reporting Technology%
|
|
\footnote{http://www.smartmontools.org/} est un ensemble
|
|
de choses pour la surveillance de l'état des disques durs
|
|
et dérivés (SSD\index{SSD}). Il permettrait, dans un monde
|
|
idéal, la prédiction des pannes.
|
|
|
|
\begin{verbatim}
|
|
smartctl -a /dev/sda
|
|
Print a large amount of SMART information for drive /dev/sda .
|
|
\end{verbatim}
|
|
|
|
% -----------------------------------------------------------
|
|
\subsection{fsck}\index{fsck}\index{fuck}
|
|
|
|
\textsl{Check and repair a Linux filesystem}
|
|
|
|
Fortune du jour : \textsf{Franchement, là, je préfère que ce soit vous qui prenne
|
|
la tronçonneuse, parce que là, c'est pas beau à voir\dots}
|
|
|
|
% -----------------------------------------------------------
|
|
\subsection{tune2fs}\index{tune2fs}
|
|
|
|
\textsl{Adjust tunable filesystem parameters on ext2/ext3/ext4
|
|
filesystems}\footnote{You can tune a fs, but you can't tuna fish}.
|
|
|
|
% -----------------------------------------------------------
|
|
% nouveau 2 juin 2024
|
|
% basé sur mes tentatives pour faire marcher l'interface
|
|
% Enttec OpenDMX USB
|
|
|
|
\section{udev} \index{udev} \label{udev}
|
|
|
|
\begin{quote}
|
|
udev supplies the system software with device events, manages
|
|
permissions of device nodes and may create additional symlinks in the
|
|
/dev directory, or renames network interfaces. The kernel usually just
|
|
assigns unpredictable device names based on the order of discovery.
|
|
Meaningful symlinks or network device names provide a way to reliably
|
|
identify devices based on their properties or current configuration.
|
|
\end{quote}
|
|
|
|
Avant de rentre dans les détails, nous pouvons aller voir un exemple
|
|
concret en page \pageref{OpenDMX} où nous atriburons un nom fixe
|
|
à une interface USB.
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
\section{Sensors} \index{sensors}
|
|
|
|
L'outil pour connaitre la température de votre CPU surmené.
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
\section{Interface réseau}\index{NIC}
|
|
|
|
On a parfois besoin de savoir dans quel état est une interface
|
|
réseau Ethernet
|
|
(\textsc{up}, \textsc{running} dans la sortie de ifconfig).
|
|
Parfois, je n'aime pas trop \textit{parser} celle-ci à grand
|
|
coup de \textit{regexp}\index{regexp}, en particulier dans un
|
|
contexte de type Busybox\index{busybox}. Et pour ce cas-là, je
|
|
préfère utiliser un binaire brassé à la maison, et dont voici
|
|
un fragment de source :
|
|
|
|
|
|
\begin{lstlisting}[language=C]
|
|
int get_if_flags(char *ifname, short *p_flags)
|
|
{
|
|
int fd;
|
|
int retcode;
|
|
struct ifreq req;
|
|
|
|
#if DEBUG_LEVEL
|
|
fprintf(stderr, ">>> %s ( \"%s\" to %p )\n", \
|
|
__func__, ifname, p_flags);
|
|
#endif
|
|
|
|
/* Sanity check */
|
|
if ( strlen(ifname) > (IFNAMSIZ-1) )
|
|
{
|
|
fprintf(stderr, "name %s to long\n", ifname);
|
|
abort();
|
|
}
|
|
|
|
fd = socket(PF_INET, SOCK_DGRAM, 0);
|
|
if (fd < 0)
|
|
{
|
|
perror("socket bla...");
|
|
return -2;
|
|
}
|
|
|
|
/* populate the struct for the request */
|
|
memset(&req, 0, sizeof(req));
|
|
strcpy(req.ifr_name, ifname);
|
|
|
|
/* do the call */
|
|
retcode = ioctl(fd, SIOCGIFFLAGS, &req);
|
|
if (retcode < 0)
|
|
{
|
|
perror("ioctl SIOCGIFFLAGS");
|
|
close(fd);
|
|
return -1;
|
|
}
|
|
#if DEBUG_LEVEL /* display the result */
|
|
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
|
#endif
|
|
|
|
close(fd);
|
|
|
|
*p_flags = req.ifr_flags;
|
|
return 0;
|
|
}
|
|
\end{lstlisting}
|
|
|
|
Hélas, je n'ai pas pu trop tester ce truc sur beaucoup de systèmes,
|
|
et je vous propose de ne pas trop lui faire confiance pour une
|
|
application critique...
|
|
|
|
% -----------------------------------------------------------
|
|
|
|
|
|
|
|
|