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
Exactly what I was looking for.... Waiting for part 2 where you add functionality.
Thanks for watching!
You deserve a ton of likes. This has answered many questions I had on adding kernel drivers.
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.
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
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.
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 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!
Short video, straight to the point, example, perfect.
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!
Wow that was really helpful. Was looking for an explanation for a while already
Simple, fun, and clear. Thanks for the video
You bet!
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?
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!
amzing stuff, wonder how you learn all these knowledge with details like this, awesome work! many thanks!
i remember messing with this years ago. Video is motivating to dive back in
Great video 👏👏👏, I remember coding a easy linux driver late 90s 😂. Thank you
So good. Thanks a bunch!
fantastic video. Thanks!
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!
thanks, really needed some guidance with this
Glad it helped!
That is awesome.
Fantastic video
Perfect timing
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
Much of that explanation of the makefile would make excellent comments in the makefile
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.
@@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!
This driver is exactly same as hello world kernel module, btw good work
Danke schön 😭
The algorithm finally put me into the right bubble 😎
man where was your channel missing all that time !
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. :-)
Finally some deep shit on youtube, subscribed
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. 🥳
This is the dopest shit ive ever seen
that LV warning is driving the back of my head crazy. >.
This video is 2 years old and I am watching it now 😢
I'm really not to comment usually. but, This video is what I really looking for.
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?
That's such a good video tho
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
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
Good,please make another tutorial!
Thanks
Sure thing!
You did something funny and useful. Also, why should those "dispatch" functions be static?
Your profile background is the same google image I used to create my background
I got to build the kernel to have build, sorry for the question, I'm very noob on linux programming
Is there a video for how to interact with the driver yet?
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?
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!
..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!
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.
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?
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
My God!
I can write a driver.
My next project? Write new drivers to replace the buggy nVidia drivers.
The piece and part I never understand is how did you know to download and install the kernel headers?
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 .
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.
How to setup the environment
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 :)
@@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.
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(?)
I thought that you could access the GPIO when using a RPi GPIO library in your chosen language? Or is that library the driver?
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!
I am using pi-zero 2 and I am geting segmentation fault when I unload - sudo rrmmod lll_gpio_driver.
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
Is it possible to build a driver using RustLang, too?
i can not find the next video in your channel
3:14 why use xforwarding and lxterminal instead of the ssh shell?
Why might never know
Is direct memory access possible as root?
Can this be done in the Pico?
nice, now also my black user can access legally to gpi
is a driver equivalent to an API?
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....
1/3 👍
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. :(
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/
shoutout to Johannes 4 gnu/linux ?
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.
@@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
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.
@@LowLevelLearning ah ok cool! I don’t understand linkers very well :(
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 ?
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
true, but sure u respect @jeffgerling proving that recompiling kernel, doent have to be durty! ish
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
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!