[FE training-materials-updates] Beginning of the I2C section
Thomas Petazzoni
thomas.petazzoni at free-electrons.com
Thu Sep 26 10:36:38 CEST 2013
Repository : git://git.free-electrons.com/training-materials.git
On branch : kernel-ng
Link : http://git.free-electrons.com/training-materials/commit/?id=0f5e4de03eb4ea86e52f3651093d24a7789d7237
>---------------------------------------------------------------
commit 0f5e4de03eb4ea86e52f3651093d24a7789d7237
Author: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
Date: Thu Sep 26 10:26:09 2013 +0200
Beginning of the I2C section
Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
>---------------------------------------------------------------
0f5e4de03eb4ea86e52f3651093d24a7789d7237
.../i2c-bus.dia} | 490 ++++++++++----------
slides/kernel-i2c/kernel-i2c.tex | 243 +++++++++-
2 files changed, 483 insertions(+), 250 deletions(-)
diff --git a/slides/sysdev-application-development/gdb-vs-gdbserver-architecture.dia b/slides/kernel-i2c/i2c-bus.dia
similarity index 70%
copy from slides/sysdev-application-development/gdb-vs-gdbserver-architecture.dia
copy to slides/kernel-i2c/i2c-bus.dia
index ec3863e..ef239ac 100644
--- a/slides/sysdev-application-development/gdb-vs-gdbserver-architecture.dia
+++ b/slides/kernel-i2c/i2c-bus.dia
@@ -65,74 +65,78 @@
<dia:layer name="Arrière-plan" visible="true" active="true">
<dia:object type="Standard - Box" version="0" id="O0">
<dia:attribute name="obj_pos">
- <dia:point val="10,5"/>
+ <dia:point val="13,6"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="9.95,4.95;24.05,23.05"/>
+ <dia:rectangle val="12.95,5.95;24.05,16.05"/>
</dia:attribute>
<dia:attribute name="elem_corner">
- <dia:point val="10,5"/>
+ <dia:point val="13,6"/>
</dia:attribute>
<dia:attribute name="elem_width">
- <dia:real val="14"/>
+ <dia:real val="11"/>
</dia:attribute>
<dia:attribute name="elem_height">
- <dia:real val="18"/>
+ <dia:real val="10"/>
</dia:attribute>
<dia:attribute name="border_width">
<dia:real val="0.10000000149011612"/>
</dia:attribute>
<dia:attribute name="border_color">
- <dia:color val="#6a8954"/>
+ <dia:color val="#868686"/>
</dia:attribute>
<dia:attribute name="inner_color">
- <dia:color val="#c5e387"/>
+ <dia:color val="#e5e5e5"/>
</dia:attribute>
<dia:attribute name="show_background">
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O1">
+ <dia:object type="Standard - Text" version="1" id="O1">
<dia:attribute name="obj_pos">
- <dia:point val="36,5"/>
+ <dia:point val="13.35,7"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="35.95,4.95;50.05,23.05"/>
- </dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="36,5"/>
- </dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="14"/>
- </dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="18"/>
- </dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.10000000149011612"/>
- </dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#5cacff"/>
+ <dia:rectangle val="13.35,6.2125;17.4215,7.2"/>
</dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#d8e5e5"/>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#Processor#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="1.0583332926034927"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="13.35,7"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="0"/>
+ </dia:attribute>
+ </dia:composite>
</dia:attribute>
- <dia:attribute name="show_background">
- <dia:boolean val="true"/>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
</dia:attribute>
</dia:object>
<dia:object type="Standard - Box" version="0" id="O2">
<dia:attribute name="obj_pos">
- <dia:point val="12,8"/>
+ <dia:point val="19,12"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="11.95,7.95;22.05,11.05"/>
+ <dia:rectangle val="18.95,11.95;23.05,15.05"/>
</dia:attribute>
<dia:attribute name="elem_corner">
- <dia:point val="12,8"/>
+ <dia:point val="19,12"/>
</dia:attribute>
<dia:attribute name="elem_width">
- <dia:real val="10"/>
+ <dia:real val="4"/>
</dia:attribute>
<dia:attribute name="elem_height">
<dia:real val="3"/>
@@ -141,122 +145,103 @@
<dia:real val="0.10000000149011612"/>
</dia:attribute>
<dia:attribute name="border_color">
- <dia:color val="#868686"/>
+ <dia:color val="#2f004a"/>
</dia:attribute>
<dia:attribute name="inner_color">
- <dia:color val="#e5e5e5"/>
+ <dia:color val="#efb9ff"/>
</dia:attribute>
<dia:attribute name="show_background">
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Box" version="0" id="O3">
+ <dia:object type="Standard - Text" version="1" id="O3">
<dia:attribute name="obj_pos">
- <dia:point val="12,13"/>
+ <dia:point val="21,13.5"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="11.95,12.95;22.05,21.05"/>
+ <dia:rectangle val="19.4733,12.905;22.5267,14.4525"/>
</dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="12,13"/>
- </dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="10"/>
- </dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="8"/>
- </dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.10000000149011612"/>
- </dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#868686"/>
- </dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#e5e5e5"/>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#I2C
+controller#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="21,13.5"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
</dia:attribute>
- <dia:attribute name="show_background">
- <dia:boolean val="true"/>
+ <dia:attribute name="valign">
+ <dia:enum val="3"/>
</dia:attribute>
+ <dia:connections>
+ <dia:connection handle="0" to="O2" connection="8"/>
+ </dia:connections>
</dia:object>
<dia:object type="Standard - Box" version="0" id="O4">
<dia:attribute name="obj_pos">
- <dia:point val="38,8"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="37.95,7.95;48.05,11.05"/>
- </dia:attribute>
- <dia:attribute name="elem_corner">
- <dia:point val="38,8"/>
- </dia:attribute>
- <dia:attribute name="elem_width">
- <dia:real val="10"/>
- </dia:attribute>
- <dia:attribute name="elem_height">
- <dia:real val="3"/>
- </dia:attribute>
- <dia:attribute name="border_width">
- <dia:real val="0.10000000149011612"/>
- </dia:attribute>
- <dia:attribute name="border_color">
- <dia:color val="#868686"/>
- </dia:attribute>
- <dia:attribute name="inner_color">
- <dia:color val="#e5e5e5"/>
- </dia:attribute>
- <dia:attribute name="show_background">
- <dia:boolean val="true"/>
- </dia:attribute>
- </dia:object>
- <dia:object type="Standard - Box" version="0" id="O5">
- <dia:attribute name="obj_pos">
- <dia:point val="38,13"/>
+ <dia:point val="28,15"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="37.95,12.95;48.05,21.05"/>
+ <dia:rectangle val="27.95,14.95;33.05,19.05"/>
</dia:attribute>
<dia:attribute name="elem_corner">
- <dia:point val="38,13"/>
+ <dia:point val="28,15"/>
</dia:attribute>
<dia:attribute name="elem_width">
- <dia:real val="10"/>
+ <dia:real val="5"/>
</dia:attribute>
<dia:attribute name="elem_height">
- <dia:real val="8"/>
+ <dia:real val="4"/>
</dia:attribute>
<dia:attribute name="border_width">
<dia:real val="0.10000000149011612"/>
</dia:attribute>
<dia:attribute name="border_color">
- <dia:color val="#868686"/>
+ <dia:color val="#d9cb2f"/>
</dia:attribute>
<dia:attribute name="inner_color">
- <dia:color val="#e5e5e5"/>
+ <dia:color val="#fff8a8"/>
</dia:attribute>
<dia:attribute name="show_background">
<dia:boolean val="true"/>
</dia:attribute>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O6">
+ <dia:object type="Standard - Text" version="1" id="O5">
<dia:attribute name="obj_pos">
- <dia:point val="17,9.5"/>
+ <dia:point val="30.5,17"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="12.835,8.92375;21.165,10.0762"/>
+ <dia:rectangle val="28.5333,15.8262;32.4667,18.1737"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
- <dia:string>#ARCH-linux-gdb#</dia:string>
+ <dia:string>#I2C
+touchscreen
+controller#</dia:string>
</dia:attribute>
<dia:attribute name="font">
- <dia:font family="monospace" style="0" name="Courier"/>
+ <dia:font family="sans" style="0" name="Helvetica"/>
</dia:attribute>
<dia:attribute name="height">
- <dia:real val="1.2347221747040749"/>
+ <dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="17,9.84125"/>
+ <dia:point val="30.5,16.4213"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -270,68 +255,60 @@
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O2" connection="8"/>
+ <dia:connection handle="0" to="O4" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O7">
+ <dia:object type="Standard - Box" version="0" id="O6">
<dia:attribute name="obj_pos">
- <dia:point val="43,9.5"/>
+ <dia:point val="35,15"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="40.3225,8.92375;45.6775,10.0762"/>
+ <dia:rectangle val="34.95,14.95;40.05,19.05"/>
</dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string>#gdbserver#</dia:string>
- </dia:attribute>
- <dia:attribute name="font">
- <dia:font family="monospace" style="0" name="Courier"/>
- </dia:attribute>
- <dia:attribute name="height">
- <dia:real val="1.2347221747040749"/>
- </dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="43,9.84125"/>
- </dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
- </dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
- </dia:attribute>
- </dia:composite>
+ <dia:attribute name="elem_corner">
+ <dia:point val="35,15"/>
</dia:attribute>
- <dia:attribute name="valign">
- <dia:enum val="2"/>
+ <dia:attribute name="elem_width">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.10000000149011612"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#5cacff"/>
+ </dia:attribute>
+ <dia:attribute name="inner_color">
+ <dia:color val="#add8e6"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
</dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O4" connection="8"/>
- </dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O8">
+ <dia:object type="Standard - Text" version="1" id="O7">
<dia:attribute name="obj_pos">
- <dia:point val="17,17"/>
+ <dia:point val="37.5,17"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="12.22,14.7792;21.78,19.2208"/>
+ <dia:rectangle val="35.9831,15.8262;39.0169,18.1737"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
- <dia:string>#Binaries and libraries
-with debugging
-symbols not
-stripped#</dia:string>
+ <dia:string>#I2C
+GPIO
+expander#</dia:string>
</dia:attribute>
<dia:attribute name="font">
<dia:font family="sans" style="0" name="Helvetica"/>
</dia:attribute>
<dia:attribute name="height">
- <dia:real val="1.1288888454437256"/>
+ <dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="17,15.6192"/>
+ <dia:point val="37.5,16.4213"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -345,32 +322,60 @@ stripped#</dia:string>
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O3" connection="8"/>
+ <dia:connection handle="0" to="O6" connection="8"/>
</dia:connections>
</dia:object>
+ <dia:object type="Standard - Box" version="0" id="O8">
+ <dia:attribute name="obj_pos">
+ <dia:point val="42,15"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="41.95,14.95;47.05,19.05"/>
+ </dia:attribute>
+ <dia:attribute name="elem_corner">
+ <dia:point val="42,15"/>
+ </dia:attribute>
+ <dia:attribute name="elem_width">
+ <dia:real val="5"/>
+ </dia:attribute>
+ <dia:attribute name="elem_height">
+ <dia:real val="4"/>
+ </dia:attribute>
+ <dia:attribute name="border_width">
+ <dia:real val="0.10000000149011612"/>
+ </dia:attribute>
+ <dia:attribute name="border_color">
+ <dia:color val="#6a8954"/>
+ </dia:attribute>
+ <dia:attribute name="inner_color">
+ <dia:color val="#c5e387"/>
+ </dia:attribute>
+ <dia:attribute name="show_background">
+ <dia:boolean val="true"/>
+ </dia:attribute>
+ </dia:object>
<dia:object type="Standard - Text" version="1" id="O9">
<dia:attribute name="obj_pos">
- <dia:point val="43,17"/>
+ <dia:point val="44.5,17"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="38.4537,14.7792;47.5463,19.2208"/>
+ <dia:rectangle val="43.55,15.8262;45.45,18.1737"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
- <dia:string>#Running program
-with binaries and
-libraries that can be
-stripped#</dia:string>
+ <dia:string>#I2C
+audio
+codec#</dia:string>
</dia:attribute>
<dia:attribute name="font">
<dia:font family="sans" style="0" name="Helvetica"/>
</dia:attribute>
<dia:attribute name="height">
- <dia:real val="1.1288888454437256"/>
+ <dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="43,15.6192"/>
+ <dia:point val="44.5,16.4213"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -384,34 +389,27 @@ stripped#</dia:string>
<dia:enum val="2"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O5" connection="8"/>
+ <dia:connection handle="0" to="O8" connection="8"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Line" version="0" id="O10">
+ <dia:object type="Standard - ZigZagLine" version="1" id="O10">
<dia:attribute name="obj_pos">
- <dia:point val="22,9.5"/>
+ <dia:point val="23.0503,13.5"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="21.85,8.91459;38.1025,10.0854"/>
+ <dia:rectangle val="23.0003,13.45;30.8618,15.1118"/>
</dia:attribute>
- <dia:attribute name="conn_endpoints">
- <dia:point val="22,9.5"/>
- <dia:point val="37.9525,9.5"/>
+ <dia:attribute name="orth_points">
+ <dia:point val="23.0503,13.5"/>
+ <dia:point val="30.5,13.5"/>
+ <dia:point val="30.5,15"/>
</dia:attribute>
- <dia:attribute name="numcp">
- <dia:int val="1"/>
- </dia:attribute>
- <dia:attribute name="line_width">
- <dia:real val="0.30000001192092896"/>
- </dia:attribute>
- <dia:attribute name="start_arrow">
- <dia:enum val="22"/>
- </dia:attribute>
- <dia:attribute name="start_arrow_length">
- <dia:real val="0.5"/>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
</dia:attribute>
- <dia:attribute name="start_arrow_width">
- <dia:real val="0.5"/>
+ <dia:attribute name="autorouting">
+ <dia:boolean val="true"/>
</dia:attribute>
<dia:attribute name="end_arrow">
<dia:enum val="22"/>
@@ -423,66 +421,28 @@ stripped#</dia:string>
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O2" connection="4"/>
- <dia:connection handle="1" to="O4" connection="8"/>
+ <dia:connection handle="0" to="O2" connection="8"/>
+ <dia:connection handle="1" to="O4" connection="1"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Text" version="1" id="O11">
+ <dia:object type="Standard - ZigZagLine" version="1" id="O11">
<dia:attribute name="obj_pos">
- <dia:point val="30,7"/>
+ <dia:point val="23,13.5"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="26.2763,7;33.7238,9.04583"/>
+ <dia:rectangle val="22.95,13.45;37.8618,15.1118"/>
</dia:attribute>
- <dia:attribute name="text">
- <dia:composite type="text">
- <dia:attribute name="string">
- <dia:string>#Serial or Ethernet
-connection#</dia:string>
- </dia:attribute>
- <dia:attribute name="font">
- <dia:font family="sans" style="0" name="Helvetica"/>
- </dia:attribute>
- <dia:attribute name="height">
- <dia:real val="1.0583332926034927"/>
- </dia:attribute>
- <dia:attribute name="pos">
- <dia:point val="30,7.7875"/>
- </dia:attribute>
- <dia:attribute name="color">
- <dia:color val="#000000"/>
- </dia:attribute>
- <dia:attribute name="alignment">
- <dia:enum val="1"/>
- </dia:attribute>
- </dia:composite>
+ <dia:attribute name="orth_points">
+ <dia:point val="23,13.5"/>
+ <dia:point val="37.5,13.5"/>
+ <dia:point val="37.5,15"/>
</dia:attribute>
- <dia:attribute name="valign">
+ <dia:attribute name="orth_orient">
<dia:enum val="0"/>
+ <dia:enum val="1"/>
</dia:attribute>
- </dia:object>
- <dia:object type="Standard - Line" version="0" id="O12">
- <dia:attribute name="obj_pos">
- <dia:point val="17,11"/>
- </dia:attribute>
- <dia:attribute name="obj_bb">
- <dia:rectangle val="16.6382,10.95;17.3618,13.05"/>
- </dia:attribute>
- <dia:attribute name="conn_endpoints">
- <dia:point val="17,11"/>
- <dia:point val="17,13"/>
- </dia:attribute>
- <dia:attribute name="numcp">
- <dia:int val="1"/>
- </dia:attribute>
- <dia:attribute name="start_arrow">
- <dia:enum val="22"/>
- </dia:attribute>
- <dia:attribute name="start_arrow_length">
- <dia:real val="0.5"/>
- </dia:attribute>
- <dia:attribute name="start_arrow_width">
- <dia:real val="0.5"/>
+ <dia:attribute name="autorouting">
+ <dia:boolean val="true"/>
</dia:attribute>
<dia:attribute name="end_arrow">
<dia:enum val="22"/>
@@ -494,23 +454,28 @@ connection#</dia:string>
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O2" connection="6"/>
- <dia:connection handle="1" to="O3" connection="1"/>
+ <dia:connection handle="0" to="O2" connection="4"/>
+ <dia:connection handle="1" to="O6" connection="1"/>
</dia:connections>
</dia:object>
- <dia:object type="Standard - Line" version="0" id="O13">
+ <dia:object type="Standard - ZigZagLine" version="1" id="O12">
<dia:attribute name="obj_pos">
- <dia:point val="43,11"/>
+ <dia:point val="23,13.5"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="42.6382,10.95;43.3618,13.05"/>
+ <dia:rectangle val="22.95,13.1382;44.8618,15.05"/>
+ </dia:attribute>
+ <dia:attribute name="orth_points">
+ <dia:point val="23,13.5"/>
+ <dia:point val="44.5,13.5"/>
+ <dia:point val="44.5,15"/>
</dia:attribute>
- <dia:attribute name="conn_endpoints">
- <dia:point val="43,11"/>
- <dia:point val="43,13"/>
+ <dia:attribute name="orth_orient">
+ <dia:enum val="0"/>
+ <dia:enum val="1"/>
</dia:attribute>
- <dia:attribute name="numcp">
- <dia:int val="1"/>
+ <dia:attribute name="autorouting">
+ <dia:boolean val="true"/>
</dia:attribute>
<dia:attribute name="start_arrow">
<dia:enum val="22"/>
@@ -531,30 +496,63 @@ connection#</dia:string>
<dia:real val="0.5"/>
</dia:attribute>
<dia:connections>
- <dia:connection handle="0" to="O4" connection="6"/>
- <dia:connection handle="1" to="O5" connection="1"/>
+ <dia:connection handle="0" to="O2" connection="4"/>
+ <dia:connection handle="1" to="O8" connection="1"/>
</dia:connections>
</dia:object>
+ <dia:object type="Standard - Text" version="1" id="O13">
+ <dia:attribute name="obj_pos">
+ <dia:point val="37.5,19.6"/>
+ </dia:attribute>
+ <dia:attribute name="obj_bb">
+ <dia:rectangle val="35.4775,19.2263;39.5225,19.9737"/>
+ </dia:attribute>
+ <dia:attribute name="text">
+ <dia:composite type="text">
+ <dia:attribute name="string">
+ <dia:string>#addr = 0x1A#</dia:string>
+ </dia:attribute>
+ <dia:attribute name="font">
+ <dia:font family="sans" style="0" name="Helvetica"/>
+ </dia:attribute>
+ <dia:attribute name="height">
+ <dia:real val="0.80000000000000004"/>
+ </dia:attribute>
+ <dia:attribute name="pos">
+ <dia:point val="37.5,19.8212"/>
+ </dia:attribute>
+ <dia:attribute name="color">
+ <dia:color val="#000000"/>
+ </dia:attribute>
+ <dia:attribute name="alignment">
+ <dia:enum val="1"/>
+ </dia:attribute>
+ </dia:composite>
+ </dia:attribute>
+ <dia:attribute name="valign">
+ <dia:enum val="2"/>
+ </dia:attribute>
+ </dia:object>
<dia:object type="Standard - Text" version="1" id="O14">
<dia:attribute name="obj_pos">
- <dia:point val="17,5"/>
+ <dia:point val="30.55,19.65"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="15.715,5;18.285,6.3175"/>
+ <dia:rectangle val="28.5225,19.2763;32.5775,20.0238"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
- <dia:string>#Host#</dia:string>
+ <dia:string>#addr = 0x2C#</dia:string>
</dia:attribute>
<dia:attribute name="font">
<dia:font family="sans" style="0" name="Helvetica"/>
</dia:attribute>
<dia:attribute name="height">
- <dia:real val="1.411111056804657"/>
+ <dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="17,6.05"/>
+ <dia:point val="30.55,19.8713"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -565,32 +563,29 @@ connection#</dia:string>
</dia:composite>
</dia:attribute>
<dia:attribute name="valign">
- <dia:enum val="0"/>
+ <dia:enum val="2"/>
</dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O0" connection="1"/>
- </dia:connections>
</dia:object>
<dia:object type="Standard - Text" version="1" id="O15">
<dia:attribute name="obj_pos">
- <dia:point val="43,5"/>
+ <dia:point val="44.55,19.55"/>
</dia:attribute>
<dia:attribute name="obj_bb">
- <dia:rectangle val="41.2525,5;44.7475,6.3175"/>
+ <dia:rectangle val="42.5437,19.1763;46.5562,19.9238"/>
</dia:attribute>
<dia:attribute name="text">
<dia:composite type="text">
<dia:attribute name="string">
- <dia:string>#Target#</dia:string>
+ <dia:string>#addr = 0x6E#</dia:string>
</dia:attribute>
<dia:attribute name="font">
<dia:font family="sans" style="0" name="Helvetica"/>
</dia:attribute>
<dia:attribute name="height">
- <dia:real val="1.411111056804657"/>
+ <dia:real val="0.80000000000000004"/>
</dia:attribute>
<dia:attribute name="pos">
- <dia:point val="43,6.05"/>
+ <dia:point val="44.55,19.7713"/>
</dia:attribute>
<dia:attribute name="color">
<dia:color val="#000000"/>
@@ -601,11 +596,8 @@ connection#</dia:string>
</dia:composite>
</dia:attribute>
<dia:attribute name="valign">
- <dia:enum val="0"/>
+ <dia:enum val="2"/>
</dia:attribute>
- <dia:connections>
- <dia:connection handle="0" to="O1" connection="1"/>
- </dia:connections>
</dia:object>
</dia:layer>
</dia:diagram>
diff --git a/slides/kernel-i2c/kernel-i2c.tex b/slides/kernel-i2c/kernel-i2c.tex
index 86466f2..f7e1c1a 100644
--- a/slides/kernel-i2c/kernel-i2c.tex
+++ b/slides/kernel-i2c/kernel-i2c.tex
@@ -1 +1,242 @@
-\subsection{Introduction to the I2C subsystem}
+\section{Introduction to the I2C subsystem}
+
+\begin{frame}{What is I2C ?}
+ \begin{itemize}
+ \item A very commonly used low-speed devices to connect on-board
+ devices to the processor.
+ \item Uses only two wires: SDA for the data, SCL for the clock.
+ \item It is a master/slave bus: only the master can initiate
+ transactions, and slaves can only reply to transactions initiated
+ by masters.
+ \item In a Linux system, the I2C controller embedded in the
+ processor is typically the master, controlling the bus.
+ \item Each slave device is identified by an unique I2C address. Each
+ transaction initiated by the master contains this address, which
+ allows the relevant slave to recognize that it should reply to
+ this particular transaction.
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{An I2C bus example}
+ \begin{center}
+ \includegraphics[width=\textwidth]{slides/kernel-i2c/i2c-bus.pdf}
+ \end{center}
+\end{frame}
+
+\begin{frame}{The I2C subsystem}
+ \begin{itemize}
+ \item Like all bus subsystems, the I2C subsystem is responsible for:
+ \begin{itemize}
+ \item Providing an API to implement I2C controller drivers
+ \item Providing an API to implement I2C device drivers, in kernel space
+ \item Providing an API to implement I2C device drivers, in user space
+ \end{itemize}
+ \item The core of the I2C subsystem is located in
+ \code{drivers/i2c}.
+ \item The I2C controller drivers are located in
+ \code{drivers/i2c/busses}.
+ \item The I2C device drivers are located throughout
+ \code{drivers/}, depending on the type of device (ex:
+ \code{drivers/input} for input devices).
+ \end{itemize}
+\end{frame}
+
+\begin{frame}{Registering an I2C device driver}
+ \begin{itemize}
+ \item Like all bus subsystems, the I2C subsystem defines a
+ \code{struct i2c_driver} that inherits from
+ \code{struct device_driver}, and which must be instantiated and
+ registered by each I2C device driver.
+ \begin{itemize}
+ \item As usual, this structure points to the \code{->probe()} and
+ \code{->remove()} functions.
+ \item It also contains an \code{id_table} field that must point to a
+ list of {\em device IDs} (which is a list of tuples containing a
+ string and some private driver data). It is used for non-DT based
+ probing of I2C devices.
+ \end{itemize}
+ \item The \code{i2c_add_driver()} and \code{i2c_del_driver()} functions
+ are used to register/unregister the driver.
+ \item If the driver doesn't do anything else in its init/exit
+ function, then it is advised to use the \code{module_i2c_driver()}
+ macro instead.
+ \end{itemize}
+\end{frame}
+
+\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 },
+ { }
+};
+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(of, <driver>_dt_ids);
+#endif
+
+static struct i2c_driver <driver>_driver = {
+ .probe = <driver>_probe,
+ .remove = <driver>_remove,
+ .id_table = <driver>_id,
+ .driver = {
+ .name = "<driver-name>",
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(<driver>_dt_ids),
+ },
+};
+
+module_i2c_driver(<driver>_driver);
+\end{minted}
+\end{block}
+\end{frame}
+
+\begin{frame}{Registering an I2C device: non-DT}
+ \begin{itemize}
+ \item On non-DT platforms, the \code{i2c_board_info} structure
+ allows to describe how an I2C device is connected to a board.
+ \item Such structures are normally defined with the
+ \code{I2C_BOARD_INFO} helper macro.
+ \begin{itemize}
+ \item Takes as argument the device name and the slave address of
+ the device on the bus.
+ \end{itemize}
+ \item An array of such structures is registed on a per-bus basis
+ using \code{i2c_register_board_info()}, when the platform is
+ initialized.
+ \end{itemize}
+\end{frame}
+
+\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 = {
+ {
+ I2C_BOARD_INFO("cs42l51", 0x4a),
+ },
+};
+
+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 */
+}
+ \end{minted}
+ \end{block}
+\end{frame}
+
+\begin{frame}{Registering an I2C device, in the DT}
+ \begin{itemize}
+ \item In the Device Tree, the I2C controller device is typically
+ defined in the \code{.dtsi} file that describes the processor.
+ \begin{itemize}
+ \item Normally defined with \code{status = "disabled"}.
+ \end{itemize}
+ \item At the board/platform level:
+ \begin{itemize}
+ \item the I2C controller device is enabled
+ (\code{status = "okay"})
+ \item the I2C bus frequency is defined, using the
+ \code{clock-frequency} property.
+ \item the I2C devices on the bus are described as childs of the
+ I2C controller node, where the \code{reg} property gives the I2C
+ slave address on the bus.
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Registering an I2C device, DT example (1/2)}
+ \begin{block}{Definition of the I2C controller, .dtsi file}
+ \begin{minted}[fontsize=\footnotesize]{perl}
+i2c at 7000c000 {
+ compatible = "nvidia,tegra20-i2c";
+ reg = <0x7000c000 0x100>;
+ interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ clocks = <&tegra_car TEGRA20_CLK_I2C1>,
+ <&tegra_car TEGRA20_CLK_PLL_P_OUT3>;
+ clock-names = "div-clk", "fast-clk";
+ status = "disabled";
+};
+ \end{minted}
+ \end{block}
+\end{frame}
+
+\begin{frame}[fragile]{Registering an I2C device, DT example (2/2)}
+ \begin{block}{Definition of the I2C device, .dts file}
+ \begin{minted}[fontsize=\footnotesize]{perl}
+i2c at 7000c000 {
+ status = "okay";
+ clock-frequency = <400000>;
+
+ alc5632: alc5632 at 1e {
+ compatible = "realtek,alc5632";
+ reg = <0x1e>;
+ gpio-controller;
+ #gpio-cells = <2>;
+ };
+};
+ \end{minted}
+ \end{block}
+\end{frame}
+
+\begin{frame}{\code{probe()} and \code{remove()}}
+
+ \begin{itemize}
+ \item The \code{->probe()} function is responsible for initializing
+ the device and registering it in the appropriate kernel
+ framework. It receives as argument:
+ \begin{itemize}
+ \item A \code{struct i2c_client} pointer, which represents the I2C
+ device itself. This structure inherits from \code{struct
+ device}.
+ \item A \code{struct i2c_device_id} pointer, which points to the
+ I2C device ID entry that matched the device that is being
+ probed.
+ \end{itemize}
+ \item The \code{->remove()} function is responsible for
+ unregistering the device from the kernel framework and shut it
+ down. It receives as argument:
+ \begin{itemize}
+ \item The same \code{struct i2c_client} pointer that was passed as
+ argument to \code{->probe()}
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]{Probe/remove example}
+ \begin{block}{}
+ \begin{minted}[fontsize=\footnotesize]{c}
+static int <driver>_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;
+}
+
+static int <driver>_remove(struct i2c_client *client)
+{
+ <private data> = i2c_get_clientdata(client);
+ /* unregister device from kernel framework */
+ /* shut down the device */
+ return 0;
+}
+ \end{minted}
+ \end{block}
+\end{frame}
\ No newline at end of file
More information about the training-materials-updates
mailing list