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.
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
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!
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😅
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?
For recursive make, you should use "$(MAKE)" instead of "make". That way the same executable will be called, that was originally invoked, and flags like --touch, --just-print, or --question will be properly propagated.
@@LowLevelTV 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!
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. :-)
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?
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???
..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!
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!
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?
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.
@@LowLevelTV 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.
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.
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!
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 .
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.
@@LowLevelTV 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
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. :(
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(?)
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//
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
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
@@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.
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....
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 🙏
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
I'm a shit programmer and hardley understand anything you talk about...but I try. Why is it a normal program is only has permissions to be executed in user space, but the kernel/driver program you wrote now has privileges to run in kernel space? Is it because the kernel header library you installed? Does that give permissions? Essentially what makes this driver program special to be executed in kernel space? What did I miss?
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?
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
Exactly what I was looking for.... Waiting for part 2 where you add functionality.
Thanks for watching!
So much information in 11 minutes, amazing. Thanks a 1,000,000 for the video.
Thanks a million for watching!
I never knew writing a basic driver was that simple, thanks mate...
Oh yes my friend! Wish you good luck with your future projects
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.
Sir this is one of the best channel which covers all the low level stuff. Thanks a lot. Keep going
I’m trying man. Thanks for watching!
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
Run: stdhw_r -salav 90 -fv -ar_tsui
@@rfctdg9988 WTF is that?
I've been looking for this sort of explanation for years now. Thanks.
Really looking forward to this series. Now I just have to get a Raspberry Pi!
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!
Short video, straight to the point, example, perfect.
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.
More to come!
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
You deserve a ton of likes. This has answered many questions I had on adding kernel drivers.
Thanks L^3!!!
I like your method of building a solution using a series of short videos. Keep the great work coming.
Glad you like them!
This video is 2 years old and I am watching it now 😢
It's ok, I am too 😅
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.
Great video 👏👏👏, I remember coding a easy linux driver late 90s 😂. Thank you
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😅
More to come!
amzing stuff, wonder how you learn all these knowledge with details like this, awesome work! many thanks!
Love ur stuff low level. Ur da goat
This driver is exactly same as hello world kernel module, btw good work
Much of that explanation of the makefile would make excellent comments in the makefile
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
Tis more of a cashier at bank to me
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?
I'm really not to comment usually. but, This video is what I really looking for.
Wow that was really helpful. Was looking for an explanation for a while already
Simple, fun, and clear. Thanks for the video
You bet!
that LV warning is driving the back of my head crazy. >.
For recursive make, you should use "$(MAKE)" instead of "make". That way the same executable will be called, that was originally invoked, and flags like --touch, --just-print, or --question will be properly propagated.
So soon we get to see kmalloc and kfree:)
Do be a darling, and check the pointer after a kmalloc unlike some developers.
Well get there ;D
The algorithm finally put me into the right bubble 😎
man where was your channel missing all that time !
Thanks!
These are gold, thank you so much for making these types of videos!
Mark, my man. Thank you so much for this generous gift! I seriously appreciate your support.
@@LowLevelTV 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!
Finally some deep shit on youtube, subscribed
That is awesome.
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. :-)
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. 🥳
So good. Thanks a bunch!
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?
thanks, really needed some guidance with this
Glad it helped!
Your profile background is the same google image I used to create my background
fantastic video. Thanks!
Fantastic video
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???
32bit GPIO over I2C
why do you prefer the xforwarded terminal over just ssh’ing in
Danke schön 😭
I got to build the kernel to have build, sorry for the question, I'm very noob on linux programming
This is the dopest shit ive ever seen
My God!
I can write a driver.
My next project? Write new drivers to replace the buggy nVidia drivers.
Perfect timing
Is there a video for how to interact with the driver yet?
You did something funny and useful. Also, why should those "dispatch" functions be static?
..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!
That's such a good video tho
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!
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?
I thought that you could access the GPIO when using a RPi GPIO library in your chosen language? Or is that library the driver?
i remember messing with this years ago. Video is motivating to dive back in
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.
There are 100% easier ways to do GPIO on the Raspberry Pi, this is just a good teaching opportunity for Linux Drivers :)
@@LowLevelTV 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.
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.
I got this to work on a rpi4 running 64bit raspi-os
The piece and part I never understand is how did you know to download and install the kernel headers?
3:14 why use xforwarding and lxterminal instead of the ssh shell?
Why might never know
would you please include a link to configuring Xforwarding and lxterminal ?Tks.
I’ll add it in the pinned comment give me a few minutes.
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!
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.
Good,please make another tutorial!
Thanks
Sure thing!
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 .
nice, now also my black user can access legally to gpi
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.
__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.
@@LowLevelTV ah ok cool! I don’t understand linkers very well :(
Just curious why we use this over wiringpi c++ raspberry
Good question! I’m just using this as an example to talk about embedded driver development.
@@LowLevelTV 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
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. :(
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(?)
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//
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
Oh who took a look into embedded two years ago? Of course Low level learning.
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
Wouldn't it be wiser to use some dedicated input capture capable timer ?
@@epolpierwith rpi integration?
@@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.
@@epolpier any suggestions?
@@adarshp6550 stm32mp1 ?
Is it possible to build a driver using RustLang, too?
I am using pi-zero 2 and I am geting segmentation fault when I unload - sudo rrmmod lll_gpio_driver.
How to setup the environment
i can not find the next video in your channel
How early can a kernel module run? Ex: I want to show a message on an e-paper display right as Linux is starting.
You can provide a list of modules to be loaded on boot, /etc/modules, /etc/modprobe.d, etc. They get loaded from /lib/kernel/
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....
is a driver equivalent to an API?
shoutout to Johannes 4 gnu/linux ?
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 🙏
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
@@gabiold thanks a lot for this excellent 👌 explanation
I'm a shit programmer and hardley understand anything you talk about...but I try. Why is it a normal program is only has permissions to be executed in user space, but the kernel/driver program you wrote now has privileges to run in kernel space? Is it because the kernel header library you installed? Does that give permissions?
Essentially what makes this driver program special to be executed in kernel space? What did I miss?
Can this be done in the Pico?
1/3 👍
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?
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.
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