Character device driver ================================ .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`Learnings in this section ` * :ref:`Version Info ` * :ref:`Setup development environment ` * :ref:`Architecture ` * :ref:`HW : ` * :ref:`SW : ` * :ref:`Applications & Libraries ` * :ref:`Kernel & Driver modules ` * :ref:`List of driver modules ` * :ref:`Custom build of driver modules ` * :ref:`Complete program : char.c ` * :ref:`Makefile ` * :ref:`Compile Program ` * :ref:`Load custom built driver modules ` * :ref:`kldload : check if the module is loaded successfully ` * :ref:`dmesg : check what happened on module load ` * :ref:`Write operation ` * :ref:`Read operation ` * :ref:`kldunload : check if the module is unloaded successfully ` * :ref:`check what happened on module unload ` * :ref:`Let us do the character device driver development ` * :ref:`Control path debugging ` * :ref:`Add prints in nl80211_small_ops ` * :ref:`Data path debugging ` * :ref:`Add prints in nl80211_small_ops ` * :ref:`FAQs ` * :ref:`Reference links ` .. _FreebsdDeviceDriver_char_fdd_1: .. tab-set:: .. tab-item:: Learnings in this section * In this section, you are going to learn .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to write a Character Device Driver module ? .. _FreebsdDeviceDriver_char_fdd_2: .. tab-set:: .. tab-item:: Version Info =============================== ======================================= # Version =============================== ======================================= Freebsd 14.1.0 =============================== ======================================= .. _FreebsdDeviceDriver_char_fdd_2_1: .. tab-set:: .. tab-item:: Setup development environment * Create directory using mkdir command .. code-block:: c test:~$ pwd /home/test/ test:~$ mkdir char_device_drivers test:~$ cd char_device_drivers test:~$ pwd home/test/char_device_drivers .. _FreebsdDeviceDriver_char_fdd_3: .. tab-set:: .. tab-item:: Architecture * Architecture .. _FreebsdDeviceDriver_char_fdd_4: .. tab-set:: .. tab-item:: HW .. code-block:: c test:~$ .. _FreebsdDeviceDriver_char_fdd_5: .. tab-set:: .. tab-item:: SW .. _FreebsdDeviceDriver_char_fdd_6: .. tab-set:: .. tab-item:: Applications & Libraries .. code-block:: c test:~$ .. _FreebsdDeviceDriver_char_fdd_7: .. tab-set:: .. tab-item:: Kernel & Driver modules .. _FreebsdDeviceDriver_char_fdd_8: .. tab-set:: .. tab-item:: List of driver modules .. tab-set:: .. tab-item:: 1. if_iwlwifi.ko .. csv-table:: :file: ./if_iwlwifi_ko.csv :widths: 50, 50 .. _FreebsdDeviceDriver_char_fdd_9: .. tab-set:: .. tab-item:: Custom build of driver modules .. _FreebsdDeviceDriver_char_fdd_10: .. tab-set:: .. tab-item:: char.c .. literalinclude:: char_device_drivers/char.c :language: c :linenos: .. _FreebsdDeviceDriver_char_fdd_11: .. tab-set:: .. tab-item:: Makefile .. literalinclude:: char_device_drivers/Makefile :language: c :linenos: .. _FreebsdDeviceDriver_char_fdd_12: .. tab-set:: .. tab-item:: Compile Program .. code-block:: c :linenos: :emphasize-lines: 1, 5, 9 test:~$ pwd home/test/char_device_drivers test:~$ ls char.c Makefile README test:~$ make .. _FreebsdDeviceDriver_char_fdd_13: .. tab-set:: .. tab-item:: Load custom built driver modules .. _FreebsdDeviceDriver_char_fdd_14: .. tab-set:: .. tab-item:: kldload : check if the module is loaded successfully .. code-block:: c :linenos: :emphasize-lines: 1 test:~$ kldload -v ./echo.ko .. _FreebsdDeviceDriver_char_fdd_15: .. tab-set:: .. tab-item:: dmesg : check what happened on module load .. code-block:: c :linenos: :emphasize-lines: 1 test:~$ dmesg Echo device loaded. .. _FreebsdDeviceDriver_char_fdd_16: .. tab-set:: .. tab-item:: Write operation * Writing data to the driver (/dev/echo) .. code-block:: c :linenos: :emphasize-lines: 1 test:~$ echo -n "Test Data" > /dev/echo Opened device "echo" successfully. Closing device "echo". .. _FreebsdDeviceDriver_char_fdd_17: .. tab-set:: .. tab-item:: Read operation * Reading data from the driver (/dev/echo) .. code-block:: c :linenos: :emphasize-lines: 1 test:~$ cat /dev/echo Opened device "echo" successfully. Test Data Closing device "echo". .. _FreebsdDeviceDriver_char_fdd_18: .. tab-set:: .. tab-item:: kldunload : check if the module is unloaded successfully .. code-block:: c :linenos: :emphasize-lines: 1 test:~$ kldunload echo .. _FreebsdDeviceDriver_char_fdd_19: .. tab-set:: .. tab-item:: check what happened on module unload .. code-block:: c :linenos: :emphasize-lines: 1 test:~$ dmesg Echo device unloaded. .. _FreebsdDeviceDriver_char_fdd_20: .. tab-set:: .. tab-item:: Let us do character device driver development ! .. _FreebsdDeviceDriver_char_fdd_21: .. tab-set:: .. tab-item:: Control path debugging .. _FreebsdDeviceDriver_char_fdd_22: .. tab-set:: .. tab-item:: Add prints in nl80211_small_ops * Open nl80211.c file with vim, add prints in all .doit functions in nl80211_small_ops .. code-block:: c test:~$ .. _FreebsdDeviceDriver_char_fdd_23: .. tab-set:: .. tab-item:: Data path debugging .. _FreebsdDeviceDriver_char_fdd_24: .. tab-set:: .. tab-item:: Add prints in nl80211_small_ops * Open nl80211.c file with vim, add prints in all .doit functions in nl80211_small_ops .. code-block:: c test:~$ .. _FreebsdDeviceDriver_char_fdd_25: .. tab-set:: .. tab-item:: FAQs .. code-block:: c test:~$ .. _FreebsdDeviceDriver_char_fdd_26: .. tab-set:: .. tab-item:: Reference links .. code-block:: c test:~$