Raspberry Pi Kernel Development | Writing a Raspberry Pi ARM GPIO Driver in C | Embedded Concepts

Поделиться
HTML-код
  • Опубликовано: 2 сен 2021
  • In this video, we talk about the purpose of drivers and why they are necessary when working on embedded systems. Later, we go over how to install the Raspberry Pi kernel headers and use them to write a kernel driver for the device. Finally, we install the kernel driver and prove that it is running on our device. This is part one in a video series for creating a GPIO driver for the Raspberry Pi!
    Drop a like and subscribe to be alerted when new videos go out.
    🏫 COURSES 🏫
    www.lowlevel.academy/courses/
    LINKS:
    LLL Merch: linktr.ee/lowlevellearning
    Code: github.com/lowlevellearning/l...
    Follow me on Twitter: / lowlevellearni1
    Follow me on Twitch: / lowlevellearning
    Join me on Discord!: / discord

Комментарии • 123

  • @appusajeev
    @appusajeev 2 года назад +93

    Exactly what I was looking for.... Waiting for part 2 where you add functionality.

  • @EE_GEEK_369
    @EE_GEEK_369 2 года назад +6

    You deserve a ton of likes. This has answered many questions I had on adding kernel drivers.

  • @dmoneyballa
    @dmoneyballa 2 года назад +1

    Thank you so much. Got assigned to write a driver in work and was looking over other code in the repo, this helped me a ton. Thanks, liked and subbed.

  • @koman35000
    @koman35000 2 года назад

    dude you'are aramzing i've been looking for linux embedded driver dev tuto for loooong time you really deserve a support for this high quality content

  • @vicktorioalhakim3666
    @vicktorioalhakim3666 Год назад +14

    I'm so happy to have discovered this channel... Back in the days finding information about such topic was a nightmare (still kinda is). Thanks a bunch!
    P.S. would be great if you can make some videos for driver dev on the Rockchip processors, and in particular for the PinePhone.

  • @Beeblzaphod
    @Beeblzaphod 2 года назад +39

    So much information in 11 minutes, amazing. Thanks a 1,000,000 for the video.

  • @phinner4270
    @phinner4270 2 года назад +18

    I never knew writing a basic driver was that simple, thanks mate...

    • @Nunya58294
      @Nunya58294 Год назад

      Oh yes my friend! Wish you good luck with your future projects

  •  2 года назад +2

    I think this is the best channel on youtube. Thank you for these videos. I can't wait for new videos to be added to the series.

  • @ThingEngineer
    @ThingEngineer 2 года назад

    Short video, straight to the point, example, perfect.

  • @bharadwajn.k9185
    @bharadwajn.k9185 2 года назад +2

    Sir this is one of the best channel which covers all the low level stuff. Thanks a lot. Keep going

  • @spaghettimitsoe1705
    @spaghettimitsoe1705 2 года назад

    Wow that was really helpful. Was looking for an explanation for a while already

  • @freshnuts864
    @freshnuts864 2 года назад +1

    Simple, fun, and clear. Thanks for the video

  • @arduinoguru7233
    @arduinoguru7233 2 года назад +25

    Perfect man, you are the only person explained to me how making driver for Linux kernel, I read couple PDF explaining this concept, and they were nightmare, please do video about making USB ( _if not possible even simple COM driver_ ) for x86 Linux kerenel

    • @rfctdg9988
      @rfctdg9988 5 месяцев назад

      Run: stdhw_r -salav 90 -fv -ar_tsui

    • @arduinoguru7233
      @arduinoguru7233 5 месяцев назад

      @@rfctdg9988 WTF is that?

  • @zekochyoudesuyo
    @zekochyoudesuyo 2 года назад +2

    Thanks L^3!!!
    I like your method of building a solution using a series of short videos. Keep the great work coming.

  • @toss1123
    @toss1123 2 года назад +2

    amzing stuff, wonder how you learn all these knowledge with details like this, awesome work! many thanks!

  • @girlswithgames
    @girlswithgames 2 года назад

    i remember messing with this years ago. Video is motivating to dive back in

  • @alexandrohdez3982
    @alexandrohdez3982 Год назад +3

    Great video 👏👏👏, I remember coding a easy linux driver late 90s 😂. Thank you

  • @johanneswestman935
    @johanneswestman935 2 года назад

    So good. Thanks a bunch!

  • @ScottPlude
    @ScottPlude 2 года назад

    fantastic video. Thanks!

  • @yashwanthkumar5332
    @yashwanthkumar5332 2 года назад +6

    Great video. Would love to watch more videos from you. Please make more kernel programming videos from beginning to advanced and share materials. Will be waiting for your next video on Kernel programming😅

  • @neelabhpaul3024
    @neelabhpaul3024 2 года назад

    thanks, really needed some guidance with this

  • @JonathanSteadman2003
    @JonathanSteadman2003 2 года назад +2

    That is awesome.

  • @isaacharris5209
    @isaacharris5209 Год назад

    Fantastic video

  • @jamesrivettcarnac
    @jamesrivettcarnac 2 года назад

    Perfect timing

  • @BenjaminWheeler0510
    @BenjaminWheeler0510 2 года назад +15

    Nice, but I’m not sure if “driver” is the right word for the “tunnel” between user space and kernel space. That’s more of a systemcall than a driver

  • @johnjoyce
    @johnjoyce 2 года назад

    Much of that explanation of the makefile would make excellent comments in the makefile

  • @Dygear
    @Dygear 2 года назад +4

    Thanks!

    • @Dygear
      @Dygear 2 года назад +1

      These are gold, thank you so much for making these types of videos!

    • @LowLevelLearning
      @LowLevelLearning  2 года назад +1

      Mark, my man. Thank you so much for this generous gift! I seriously appreciate your support.

    • @Dygear
      @Dygear 2 года назад +2

      @@LowLevelLearning you deserve much more. These videos have been phenomenal. Your videos for assembly on the pico, and the full fat Pi are awesome. It give people like me a blue print for learning that are much easier to follow than reading the manual where I would be entirely lost. Thank you for all of these videos!

  • @srivathsa3387
    @srivathsa3387 2 года назад +1

    This driver is exactly same as hello world kernel module, btw good work

  • @mohammadv8560
    @mohammadv8560 2 года назад

    Danke schön 😭

  • @gflorin7761
    @gflorin7761 2 месяца назад

    The algorithm finally put me into the right bubble 😎

  • @SirDzair
    @SirDzair 2 года назад

    man where was your channel missing all that time !

  • @CyReVolt
    @CyReVolt 2 года назад +5

    How do you feel about trying out 9front on the RPi? Then you need no X11 forwarding, you can just drawterm into it. And you have a much simpler, smaller OS to look at. Would be an interesting next video. :-)

  • @ccflan
    @ccflan 2 года назад +1

    Finally some deep shit on youtube, subscribed

  • @CyReVolt
    @CyReVolt 2 года назад

    We just did the same, on a Lichee RV (D1 RISC-V Board), on bare metal, in Rust. It's a lot of fun. :-) Next up is DRAM init. 🥳

  • @ethanbradley4282
    @ethanbradley4282 2 года назад

    This is the dopest shit ive ever seen

  • @comicsansgreenkirby
    @comicsansgreenkirby 2 года назад

    that LV warning is driving the back of my head crazy. >.

  • @vanshajdhar9223
    @vanshajdhar9223 Месяц назад

    This video is 2 years old and I am watching it now 😢

  • @gordon2299
    @gordon2299 2 года назад

    I'm really not to comment usually. but, This video is what I really looking for.

  • @piggoy
    @piggoy 2 месяца назад

    Really informative video, love the channel! I'm confused by the structure of the makefile, I would expect there to be a command that invokes a compiler (such as gcc) in the list of instructions. What compiler is actually being used and how is it invoked?

  • @paulushdk
    @paulushdk 2 года назад +1

    That's such a good video tho

  • @LowLevelLearning
    @LowLevelLearning  2 года назад +1

    To X-forward a terminal over ssh: do `ssh pi@ -Y`, then on the Raspberry Pi type `lxterminal`. You also don't need to do this if you're okay with coding over the SSH PTY.
    What's your latest Raspberry Pi project???

    • @CallousCoder
      @CallousCoder 2 года назад +1

      32bit GPIO over I2C

    • @spencersharkey
      @spencersharkey 2 года назад

      why do you prefer the xforwarded terminal over just ssh’ing in

  • @CallousCoder
    @CallousCoder 2 года назад +4

    So soon we get to see kmalloc and kfree:)
    Do be a darling, and check the pointer after a kmalloc unlike some developers.

  • @simonedallai48
    @simonedallai48 2 года назад

    Good,please make another tutorial!
    Thanks

  • @paukpauk4813
    @paukpauk4813 2 года назад

    You did something funny and useful. Also, why should those "dispatch" functions be static?

  • @mstrmm35
    @mstrmm35 2 года назад

    Your profile background is the same google image I used to create my background

  • @nelsonamador5412
    @nelsonamador5412 4 месяца назад

    I got to build the kernel to have build, sorry for the question, I'm very noob on linux programming

  • @scriptles
    @scriptles Год назад

    Is there a video for how to interact with the driver yet?

  • @eemtech1606
    @eemtech1606 4 месяца назад

    If we are writing external device driver, where to put the driver code? Should I just add it to the __init function and call it thorough module_init()? Can you make video explaining how to handle a real external device driver, say, like a mouse driver or a soundcard driver, how the driver handle them and how they interact with other application so we can use them?

  • @user-ly8ul1tw3q
    @user-ly8ul1tw3q 8 месяцев назад +1

    Hey, I did these steps until 5:25 where I got error that build file does not exist. What should I do if terminal displays that I have the newest version of kernel headers? Would appreciate any feedback!

  • @warplanner8852
    @warplanner8852 Год назад +1

    ..good stuff and well taught. But a minuscule grammatical nit pick: it's "..that gets *RUN* in.." not "..that gets *RAN* in..".
    _Thanks muchly_ for your videos!

  • @cutiepie0608
    @cutiepie0608 2 года назад +3

    make[1]: *** /lib/modules/5.10.17-v7l+/build: No such file or directory. Stop.
    i am getting this error, i have installed kernel headers.

  • @HitAndMissLab
    @HitAndMissLab Год назад

    Do you have a video that explains how to SSH into Raspberry PI and Raspberry Pico and how to setup cables etc. I like your videos but I don't understand where you write code, on your PC or on the Raspberry?

  • @Jojo-nf1yk
    @Jojo-nf1yk 2 года назад +2

    Hi, this video seems to be very interesting. To reproduce your example, could I use 32 or 64-bit Raspi-OS ? or probably both ?
    Thanks for your sharing.

    • @thebeacons4704
      @thebeacons4704 2 года назад

      I got this to work on a rpi4 running 64bit raspi-os

  • @livesimplyandhumbly
    @livesimplyandhumbly 2 года назад

    My God!
    I can write a driver.
    My next project? Write new drivers to replace the buggy nVidia drivers.

  • @primeix
    @primeix Год назад

    The piece and part I never understand is how did you know to download and install the kernel headers?

  • @vamsikrishna9825
    @vamsikrishna9825 2 года назад

    Hello,
    If RPi has Debian Linux. We can use some inbuilt gpio drivers like (import RPi.GPIO as GPIO) to access GPIO. How is this video different from that? Are both methods works the same or not? Could you please explain me more. I am a beginner for this linux kernal and driver development on RPI. Thanks .

  • @TKR911
    @TKR911 2 года назад +1

    would you please include a link to configuring Xforwarding and lxterminal ?Tks.

    • @LowLevelLearning
      @LowLevelLearning  2 года назад +1

      I’ll add it in the pinned comment give me a few minutes.

  • @pranathireddy1793
    @pranathireddy1793 2 месяца назад

    How to setup the environment

  • @warthog618
    @warthog618 2 года назад +1

    Nice intro into how to compile and load Linux drivers, but I'm curious as to why you would rather write to hardware in a driver than use the Linux GPIO uAPI from userspace, say using libgpiod. Also interested to see how you prevent conflict between your driver and the existing gpiolib/pinctrl drivers present in the Raspberry Pi kernel.

    • @LowLevelLearning
      @LowLevelLearning  2 года назад +6

      There are 100% easier ways to do GPIO on the Raspberry Pi, this is just a good teaching opportunity for Linux Drivers :)

    • @warthog618
      @warthog618 2 года назад

      @@LowLevelLearning For sure, but if you are writing Linux drivers then you need to be aware of the the environment you are playing in. You may be sharing the hardware with other parts of the kernel, and the kernel may well provide better ways to do things than accessing the hardware directly.

  • @gcarrillodev
    @gcarrillodev 4 месяца назад

    Note: Capitalize your makefile. I usually just do "makefile" as a name, but apparently the kernel build system is more fussy and requires a "Makefile". Might vary from setup to setup(?)

  • @TobiasSample
    @TobiasSample 7 месяцев назад

    I thought that you could access the GPIO when using a RPi GPIO library in your chosen language? Or is that library the driver?

  • @56phil020244
    @56phil020244 2 года назад

    Unrelated question: How does one get a chunk of memory, like alloc, from the heap in ARM64 assembler? I suppose a supervisor call is used, but I can't find anything on the subject. BTW, I'm working on a M1 Mac, so I need the technique for MacOS. I'll be getting a Raspberry PI, soon, so I'd be interested in a linux solution as well. Thanks!

  • @eshwaranjayaraman1764
    @eshwaranjayaraman1764 2 года назад

    I am using pi-zero 2 and I am geting segmentation fault when I unload - sudo rrmmod lll_gpio_driver.

  • @annguyenhoangphu451
    @annguyenhoangphu451 2 года назад

    Hi, thank you for your video.
    I have follow your instruction but after step "sudo apt install raspberrypi-kernel-headers", it was download but there are no build folder in side the /lib/modules//

    • @vlya1533
      @vlya1533 2 года назад +2

      Probably the installed package doesn't match the loaded kernel, that version must be identical
      $ uname -r
      5.10.60-v7+
      $ dpkg -L raspberrypi-kernel-headers | grep '/lib/.*/build'
      /lib/modules/5.10.60+/build
      /lib/modules/5.10.60-v7+/build
      /lib/modules/5.10.60-v7l+/build
      $ dpkg -S /lib/modules/`uname -r`/build
      raspberrypi-kernel-headers: /lib/modules/5.10.60-v7+/build

  • @ardawanx
    @ardawanx Год назад

    Is it possible to build a driver using RustLang, too?

  • @hillelbarkan
    @hillelbarkan 2 года назад +1

    i can not find the next video in your channel

  • @dougaltolan3017
    @dougaltolan3017 2 года назад +3

    3:14 why use xforwarding and lxterminal instead of the ssh shell?

  • @tuskiomisham
    @tuskiomisham 2 года назад

    Is direct memory access possible as root?

  • @Victoria-fs9jo
    @Victoria-fs9jo 2 года назад

    Can this be done in the Pico?

  • @fair6685
    @fair6685 2 года назад

    nice, now also my black user can access legally to gpi

  • @kekons23
    @kekons23 Год назад

    is a driver equivalent to an API?

  • @TONYSTARKOO7
    @TONYSTARKOO7 Год назад

    I'm currently working on building complete 64 bit OS for rpi 4 from scratch, i've barely installed debian 10 server with custom bootloader and kernel (rpi-5.19.y). Its part of my RA-ship project and i need to dig deep in device drivers and control over those GPIOs through C and QT... i'm finding hard time for every single step i do bcuz my custom built image lacks a lot of useful plugins (like i cant even do raspi-config since it says it doesnt exist and unable to install that either) that would be wonderful if you guide me a lil bit....

  • @n0kodoko143
    @n0kodoko143 2 года назад

    1/3 👍

  • @StevenCookFX
    @StevenCookFX Год назад

    For some reason when I type "ls /lib/mod" I get no such directory. You assume that the person on the other end has everything working as you do and I am unable to continue with your tutorial and follow along. :(

  • @IgnoreSolutions
    @IgnoreSolutions 2 года назад +1

    How early can a kernel module run? Ex: I want to show a message on an e-paper display right as Linux is starting.

    • @LowLevelLearning
      @LowLevelLearning  2 года назад +1

      You can provide a list of modules to be loaded on boot, /etc/modules, /etc/modprobe.d, etc. They get loaded from /lib/kernel/

  • @namename8986
    @namename8986 Год назад

    shoutout to Johannes 4 gnu/linux ?

  • @vrumivruni
    @vrumivruni 2 года назад +1

    Just curious why we use this over wiringpi c++ raspberry

    • @LowLevelLearning
      @LowLevelLearning  2 года назад

      Good question! I’m just using this as an example to talk about embedded driver development.

    • @vrumivruni
      @vrumivruni 2 года назад

      @@LowLevelLearning yea. I find it really interesting and cool! Im actually in a computer based systems class, but we arent this deep in it yet. But I am learning a lot from you! Thanks for you content. Been seeing your rust videos too! Here at Oklahoma State University we are trying to make a security key using rust. Something like solokeys

  • @gregoryfenn1462
    @gregoryfenn1462 2 года назад +1

    Why are both “__init func” and “module_init(func)” needed surely one is enough to declare that func is to be run when the driver is installed? (Likewise for __exit and module_exit). It feels like a lot of logical redundancy and boilerplate code.

    • @LowLevelLearning
      @LowLevelLearning  2 года назад +2

      __init tells the linker in what section of the ELF to put that code, where as module_init tells the kernel module loader what function to run first.

    • @gregoryfenn1462
      @gregoryfenn1462 2 года назад

      @@LowLevelLearning ah ok cool! I don’t understand linkers very well :(

  • @adarshp6550
    @adarshp6550 2 года назад +1

    Wt if I wanted to get data ( rise and low timing ) from 2 lines (TX detect and rx detect) from my custom lidar but facing issue to get gpio to read both of them...
    I mean by -
    Once a sense pulse is given lidar scan 1000 points(ie 1000 of both TX detect and Rx detect signals)
    TX detect goes high once the laser shoots every single pulse
    Rx detect goes high on reflection detection

    • @epolpier
      @epolpier 2 года назад

      Wouldn't it be wiser to use some dedicated input capture capable timer ?

    • @adarshp6550
      @adarshp6550 2 года назад

      @@epolpierwith rpi integration?

    • @epolpier
      @epolpier 2 года назад

      @@adarshp6550 I just checked that indeed there is no support for input capture in rpi so you should use a different platform for the use case you would like to implement.

    • @adarshp6550
      @adarshp6550 2 года назад

      @@epolpier any suggestions?

    • @epolpier
      @epolpier 2 года назад

      @@adarshp6550 stm32mp1 ?

  • @AxelWerner
    @AxelWerner 2 года назад

    Uhm. Help! I don't understand that function definition. For all C I know, a function is defined like this: return_type function_name( parameter list ); now how come there is some __init keyword between return type and function name? What's that exactly? Thanks 🙏

    • @gabiold
      @gabiold 2 года назад +1

      In general, most compilers support a sort of attributes to tell how to compile that function, like where to place it in the binary (can be an absolute location or name of memory segment), which calling convention to use that determines the stack frame handling of the function (this code is in addition to what you wrote inside the function body, like pushing used resisters on stack before executing your code, then restoring it afterwards). For example, (in gcc) there is also an attribute inline keyword, which tells the compiler to actually copy the function code everywhere it is called from. So it won't use call and return, possibly optimize the hell out of the stack frame. Useful for one-line functions which you want as performant as possible.
      Examine the disassembly of your C code, you can learn a lot from it!
      To answer the specific __init and __exit keywords, here is a link to a book:
      www.oreilly.com/library/view/linux-device-drivers/9781785280009/e636c201-5e6f-4ddb-a4b3-9bd72f71b9b0.xhtml

    • @AxelWerner
      @AxelWerner 2 года назад +1

      @@gabiold thanks a lot for this excellent 👌 explanation

  • @stephenjohnstone9940
    @stephenjohnstone9940 2 года назад

    true, but sure u respect @jeffgerling proving that recompiling kernel, doent have to be durty! ish

  • @galihtanu
    @galihtanu 2 года назад

    Sir my i ask question, i use Ubuntu and get stuck on how to create and compile c code on raspbery Pi Pico?
    ITS should use rasp Pi OS as environtment?
    Or can use x86 laptop to create / cross compile it?

  • @TensorWave
    @TensorWave Год назад

    So all you did was wrote a "hello world" LKM that has nothing to do with Raspberry Pi or GPIO. Title of your video is misleading and clickbait.

  • @lxw5231
    @lxw5231 3 месяца назад

    Great tutorial. thank you. after I installed kernel-headers there is no $(uname -r)\build folder created. but I saw $(uname -r)\kernel folder. then I change Makefile. and make, it says
    pi@raspberrypi:~/lll-gpio-driver $ make
    make -C /lib/modules/4.19.118-v7l+/kernel M=/home/pi/lll-gpio-driver modules
    make[1]: Entering directory '/lib/modules/4.19.118-v7l+/kernel'
    make[1]: *** No rule to make target 'modules'. Stop.
    make[1]: Leaving directory '/lib/modules/4.19.118-v7l+/kernel'
    make: *** [Makefile:6: all] Error 2
    please let me know what I did wrong.
    thanks

  • @zrodger2296
    @zrodger2296 2 года назад +5

    Really looking forward to this series. Now I just have to get a Raspberry Pi!

    • @LowLevelLearning
      @LowLevelLearning  2 года назад

      Ha! Yes that would be useful. In theory this should work on any embedded platform. Things will obviously change as we add features and get more specific. Thanks for watching!