[bootlin/training-materials updates] master: I2C slides: use real examples (5d710b8c)
Michael Opdenacker
michael.opdenacker at bootlin.com
Mon Mar 18 15:27:00 CET 2019
Repository : https://github.com/bootlin/training-materials
On branch : master
Link : https://github.com/bootlin/training-materials/commit/5d710b8c68c0deba0c746c448709128cdfef61e3
>---------------------------------------------------------------
commit 5d710b8c68c0deba0c746c448709128cdfef61e3
Author: Michael Opdenacker <michael.opdenacker at bootlin.com>
Date: Mon Mar 18 15:27:00 2019 +0100
I2C slides: use real examples
- Instead of dummy ones using <driver_name>
Signed-off-by: Michael Opdenacker <michael.opdenacker at bootlin.com>
>---------------------------------------------------------------
5d710b8c68c0deba0c746c448709128cdfef61e3
slides/kernel-i2c/kernel-i2c.tex | 159 +++++++++++++++++++++++----------------
1 file changed, 96 insertions(+), 63 deletions(-)
diff --git a/slides/kernel-i2c/kernel-i2c.tex b/slides/kernel-i2c/kernel-i2c.tex
index 9f17c9dc..ea5c0f02 100644
--- a/slides/kernel-i2c/kernel-i2c.tex
+++ b/slides/kernel-i2c/kernel-i2c.tex
@@ -66,34 +66,36 @@
\begin{frame}[fragile]{Registering an I2C device driver: example}
\begin{block}{}
\begin{minted}[fontsize=\tiny]{c}
-static const struct i2c_device_id <driver>_id[] = {
- { "<device-name>", 0 },
+static const struct i2c_device_id adxl345_i2c_id[] = {
+ { "adxl345", ADXL345 },
+ { "adxl375", ADXL375 },
{ }
};
-MODULE_DEVICE_TABLE(i2c, <driver>_id);
-#ifdef CONFIG_OF
-static const struct of_device_id <driver>_dt_ids[] = {
- { .compatible = "<vendor>,<device-name>", },
- { }
+MODULE_DEVICE_TABLE(i2c, adxl345_i2c_id);
+
+static const struct of_device_id adxl345_of_match[] = {
+ { .compatible = "adi,adxl345" },
+ { .compatible = "adi,adxl375" },
+ { },
};
-MODULE_DEVICE_TABLE(of, <driver>_dt_ids);
-#endif
-static struct i2c_driver <driver>_driver = {
- .probe = <driver>_probe,
- .remove = <driver>_remove,
- .id_table = <driver>_id,
+MODULE_DEVICE_TABLE(of, adxl345_of_match);
+
+static struct i2c_driver adxl345_i2c_driver = {
.driver = {
- .name = "<driver-name>",
- .owner = THIS_MODULE,
- .of_match_table = of_match_ptr(<driver>_dt_ids),
+ .name = "adxl345_i2c",
+ .of_match_table = adxl345_of_match,
},
+ .probe = adxl345_i2c_probe,
+ .remove = adxl345_i2c_remove,
+ .id_table = adxl345_i2c_id,
};
-module_i2c_driver(<driver>_driver);
+module_i2c_driver(adxl345_i2c_driver);
\end{minted}
\end{block}
+From \kfile{drivers/iio/accel/adxl345_i2c.c}
\end{frame}
\begin{frame}{Registering an I2C device: non-DT}
@@ -115,26 +117,30 @@ module_i2c_driver(<driver>_driver);
\begin{frame}[fragile]{Registering an I2C device, non-DT example}
\begin{block}{}
\begin{minted}[fontsize=\tiny]{c}
-static struct i2c_board_info <board>_i2c_devices[] __initdata = {
+static struct i2c_board_info __initdata em7210_i2c_devices[] = {
{
- I2C_BOARD_INFO("cs42l51", 0x4a),
+ I2C_BOARD_INFO("rs5c372a", 0x32),
},
};
-void board_init(void)
-{
- /*
- * Here should be the registration of all devices, including
- * the I2C controller device.
- */
-
- i2c_register_board_info(0, <board>_i2c_devices,
- ARRAY_SIZE(<board>_i2c_devices));
+...
- /* More devices registered here */
+static void __init em7210_init_machine(void)
+{
+ register_iop32x_gpio();
+ platform_device_register(&em7210_serial_device);
+ platform_device_register(&iop3xx_i2c0_device);
+ platform_device_register(&iop3xx_i2c1_device);
+ platform_device_register(&em7210_flash_device);
+ platform_device_register(&iop3xx_dma_0_channel);
+ platform_device_register(&iop3xx_dma_1_channel);
+
+ i2c_register_board_info(0, em7210_i2c_devices,
+ ARRAY_SIZE(em7210_i2c_devices));
}
\end{minted}
\end{block}
+ From \kfile{arch/arm/mach-iop32x/em7210.c}
\end{frame}
\begin{frame}{Registering an I2C device, in the DT}
@@ -158,7 +164,7 @@ void board_init(void)
\end{frame}
\begin{frame}[fragile]{Registering an I2C device, DT example (1/2)}
- \begin{block}{Definition of the I2C controller, \code{sun7i-a20.dtsi} file}
+ \begin{block}{Definition of the I2C controller}
\begin{minted}[fontsize=\footnotesize]{perl}
i2c0: i2c at 01c2ac00 {
compatible = "allwinner,sun7i-a20-i2c",
@@ -172,10 +178,11 @@ i2c0: i2c at 01c2ac00 {
};
\end{minted}
\end{block}
+ From \kfile{arch/arm/boot/dts/sun7i-a20.dtsi}
\end{frame}
\begin{frame}[fragile]{Registering an I2C device, DT example (2/2)}
- \begin{block}{Definition of the I2C device, \code{sun7i-a20-olinuxino-micro.dts} file}
+ \begin{block}{Definition of the I2C device}
\begin{minted}[fontsize=\footnotesize]{perl}
&i2c0 {
pinctrl-names = "default";
@@ -194,6 +201,7 @@ i2c0: i2c at 01c2ac00 {
};
\end{minted}
\end{block}
+ From \kfile{arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts}
\end{frame}
\begin{frame}{\code{probe()} and \code{remove()}}
@@ -219,28 +227,45 @@ i2c0: i2c at 01c2ac00 {
\end{itemize}
\end{frame}
-\begin{frame}[fragile]{Probe/remove example}
+\begin{frame}[fragile]{Probe example}
\begin{block}{}
- \begin{minted}[fontsize=\footnotesize]{c}
-static int <driver>_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
+ \begin{minted}[fontsize=\scriptsize]{c}
+static int da311_probe(struct i2c_client *client,
+ const struct i2c_device_id *id)
{
- /* initialize device */
- /* register to a kernel framework */
-
- i2c_set_clientdata(client, <private data>);
- return 0;
+ struct iio_dev *indio_dev; // framework structure
+ da311_data *data; // per device structure
+ ...
+ // Allocate framework structure with per device struct inside
+ indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+ data = iio_priv(indio_dev);
+ data->client = client;
+ i2c_set_clientdata(client, indio_dev);
+ // Prepare device and initialize indio_dev
+ ...
+ // Register device to framework
+ ret = iio_device_register(indio_dev);
+ ...
+ return ret;
}
+ \end{minted}
+ \end{block}
+ From \kfile{drivers/iio/accel/da311.c}
+\end{frame}
-static int <driver>_remove(struct i2c_client *client)
+\begin{frame}[fragile]{Remove example}
+ \begin{block}{}
+ \begin{minted}[fontsize=\footnotesize]{c}
+static int da311_remove(struct i2c_client *client)
{
- <private data> = i2c_get_clientdata(client);
- /* unregister device from kernel framework */
- /* shut down the device */
- return 0;
+ struct iio_dev *indio_dev = i2c_get_clientdata(client);
+ // Unregister device from framework
+ iio_device_unregister(indio_dev);
+ return da311_enable(client, false);
}
\end{minted}
\end{block}
+ From \kfile{drivers/iio/accel/da311.c}
\end{frame}
\setuplabframe
@@ -288,26 +313,34 @@ static int <driver>_remove(struct i2c_client *client)
\begin{frame}[fragile]{I2C: message transfer example}
\begin{block}{}
- \begin{minted}[fontsize=\footnotesize]{c}
-struct i2c_msg msg[2];
-int error;
-u8 start_reg;
-u8 buf[10];
-
-msg[0].addr = client->addr;
-msg[0].flags = 0;
-msg[0].len = 1;
-msg[0].buf = &start_reg;
-start_reg = 0x10;
-
-msg[1].addr = client->addr;
-msg[1].flags = I2C_M_RD;
-msg[1].len = sizeof(buf);
-msg[1].buf = buf;
-
-error = i2c_transfer(client->adapter, msg, 2);
+ \begin{minted}[fontsize=\tiny]{c}
+static int st1232_ts_read_data(struct st1232_ts_data *ts)
+{
+ ...
+ struct i2c_client *client = ts->client;
+ struct i2c_msg msg[2];
+ int error;
+ ...
+ u8 start_reg = ts->chip_info->start_reg;
+ u8 *buf = ts->read_buf;
+
+ /* read touchscreen data */
+ msg[0].addr = client->addr;
+ msg[0].flags = 0;
+ msg[0].len = 1;
+ msg[0].buf = &start_reg;
+
+ msg[1].addr = ts->client->addr;
+ msg[1].flags = I2C_M_RD;
+ msg[1].len = ts->read_buf_len;
+ msg[1].buf = buf;
+
+ error = i2c_transfer(client->adapter, msg, 2);
+ ...
+}
\end{minted}
\end{block}
+From \kfile{drivers/input/touchscreen/st1232.c}
\end{frame}
\begin{frame}{SMBus calls}
More information about the training-materials-updates
mailing list