base on A Tutorial how to get started with Linux Kernel Modules and Linux Drivers. # Linux Driver Tutorial Here you can find examples for simple Linux Kernel Modules and Linux Drivers. ## Preparation I used a Raspberry Pi 3 to develop and test my modules and drivers. To compile them, you need to install the Kernel headers on your Pi. On Raspbian you can do this with the following command: ```bash sudo apt update sudo apt install raspberrypi-kernel-headers ``` Raspberry Pi OS is only installs the latest kernel headers. So, make sure, you are running the latest kernel. You can do this by running: ```bash sudo apt upgrade ``` You also need the build utils (make, gcc, ...) but they come preinstalled on Raspbian. ## Content In this repo you can find examples for: 1. Simple Kernel Module 2. Device Numbers and Device Files 3. Create device file in driver and callbacks 4. GPIO Driver 5. Text LCD Driver 6. PWM Module 7. Temperature Sensor (I2C) 8. Timer in Linux Kernel Modules 9. High Resolution Timer in Linux Kernel Modules 10. Accessing SPI with a Linux Kernel Module (BMP280 sensor again) 11. Using a GPIO Interrupt in a Linux Kernel Module 12. Using Parameters in a Linux Kernel Module 13. IOCTL in a Linux Kernel Module 14. Threads in a Linux Kernel Module 15. Sending a signal from a Linux Kernel Module to an userspace application 16. The poll callback 17. Waitqueues in a Linux Kernel Module 18. Create procfs entries from a Linux Kernel Module 19. Create sysfs entries from a Linux Kernel Module 20. Parse the device tree from a Linux Kernel Module to get the deivce properties of a specific device 21. Device Tree GPIO Driver 22. Device Tree Driver for I2C Device 23. Dynamical memory management in a Linux Kernel module 24. Serial (UART) Driver 25. Industrial IO compatible driver for an ATMEGA I2C ADC 26. Device Tree SPI Driver (IIO compatible driver for Atmega SPI ADC) 27. Misc Device 28. Mutex for exclusive access to shared resource 29. Completions for synchronisation 30. Direct Memory Access (DMA) memcopy example 31. Accessing files form a Linux Driver 32. The mmap callback 33. Linked Lists 34. Registering device numbers, read and write callback in character devices Take 2 35. Private Data in struct file 36. I2C Device Driver without Device Tree 37. Sysfs Class 38. Kernel Log levels ## More Information For more information about my Linux Driver examples check out my [videos and my playlist](https://www.youtube.com/watch?v=x1Y203vH-Dc&list=PLCGpd0Do5-I3b5TtyqeF1UdyD4C-S-dMa) ## Support me If you want to support me, you can buy me a coffee [buymeacoffee.com/johannes4linux](https://www.buymeacoffee.com/johannes4linux). ", Assign "at most 3 tags" to the expected json: {"id":"13288","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"