Doc/ioexpand: add descriptions about ioexpander
Signed-off-by: buxiasen <buxiasen@xiaomi.com>
diff --git a/Documentation/components/drivers/special/ioexpander.rst b/Documentation/components/drivers/special/ioexpander.rst
index 18d78e8..5a2f513 100644
--- a/Documentation/components/drivers/special/ioexpander.rst
+++ b/Documentation/components/drivers/special/ioexpander.rst
@@ -1,3 +1,35 @@
==========================
IO Expander Device Drivers
==========================
+
+- ``include/nuttx/ioexpander/ioexpander.h`` and ``include/nuttx/ioexpander/gpio.h``.
+ All structures and APIs needed to work with ioexpander drivers are provided in
+ this header file.
+
+- ``struct ioexpander_ops_s``. Each ioexpand device driver must implement
+ an instance of ``struct ioexpander_ops_s``. That structure defines a
+ call table with the methods, and we also provide macros to help access methods.
+
+- we also provide method ``gpio_lower_half`` to make ioexpander compatible with normal gpio.
+
+- **Binding ioexpander Drivers**. ioexpander drivers are not normally directly
+ accessed by user code, we should always get lower level drivers, for example I2C,
+ and map extended gpio feature same asa normal gpio. See for example,
+ ``int nrf52_sx1509_initialize(void)``
+ in ``boards/arm/nrf52/thingy52/src/nrf52_sx1509.c``. In general, the binding
+ sequence is:
+
+ #. Get an instance of ``struct i2c_master_s`` from the
+ hardware-specific I2C device driver, and
+ #. Provide that instance and configurations to the ioexpander initialization method
+ to get the ``struct ioexpander_dev_s`` ioe device instance.
+ #. Then use ioe device instance to do ioexpander operations, or use ``gpio_lower_half``
+ to make ioexpand compatible with normal gpio.
+
+
+- **Examples**: ``drivers/ioexpander/pca9555.c``,
+ ``drivers/input/aw86225.c``,
+ ``drivers/analog/lmp92001.c``,
+ ``drivers/ioexpander/ioe_rpmsg.c``,
+ ``boards/sim/sim/sim/src/sim_ioexpander.c``,
+ ``boards/arm/nrf52/thingy52/src/nrf52_sx1509.c`` etc.