Low Byte Productions
Low Byte Productions
  • 112
  • 2 280 774
Rendering 3D Graphics On An Oscilloscope
In this video, we're learning how to draw on an oscilloscope. By utilising the X-Y mode of the scope, combined with some clever firmware to generate the right signals, and a sprinkle of DIY digital-to-analog conversion, we can render animated 3D graphics on a scope in real time!
00:00:00 3D Animated Demo
00:01:36 Understanding X-Y Mode
00:05:00 Firmware Architecture Overview
00:09:52 PWM Digital-to-Analog Conversion
00:14:48 Manually creating images
00:21:57 Visualizing the signals
00:25:03 Writing the static image firmware
00:48:30 PWM signals on the scope
00:51:14 Building the low-pass filters
00:58:42 First 3D image
01:03:30 Reading the 3D renderer firmware code
01:17:15 Final demo
=[ 🔗 Links 🔗 ]=
⭐️ Become a patron and get bonus videos! www.patreon.com/lowleveljavascript
🗣 Discord: discord.gg/FPWaVgk
💻 Github Repo: github.com/lowbyteproductions/3d-oscilloscope-renderer
Переглядів: 4 805

Відео

Using LEDs As Precise GPIOs
Переглядів 2,8 тис.3 місяці тому
In this video, we're looking at a technique for precisely analyzing signals from firmware when all you can do is blink a LED. By writing to an LED as if it were a typical GPIO, and building a surprisingly simple receiver, we can probe signals with an oscilloscope without even touching the board! =[ 🔗 Links 🔗 ]= 🗣 Discord: discord.gg/FPWaVgk ⭐️ Patreon: www.patreon.com/lowleveljavascript
Bare Metal Bit Banging: WS2812B Driver
Переглядів 8 тис.4 місяці тому
In this video, we examine the WS2812B RGB LED device, and write a bit-banged driver from scratch for an STM32 microcontroller. Chapters 00:00 What is a WS2812 / NeoPixel 02:33 Hardware overview 06:00 What is a "device driver"? 08:35 The signalling protocol 15:00 Reviewing the datasheet 22:00 Figuring out the GPIO timing 49:32 First LED test 53:36 Implementing the driver interface =[ 🔗 Links 🔗 ]...
Getting up in another processes memory
Переглядів 14 тис.6 місяців тому
In this video, we learn how we can read memory belonging to other processes by building a memory dumper from scratch. One of the key components is the /proc file system: an interface that the kernel provides for introspecting processes. Combined with ptrace, a system call that allows attaching to and taking control of another process, we write a program to automate extracting information that w...
The mechanics of VIRTUAL MEMORY //Source Dive// 005
Переглядів 23 тис.6 місяців тому
In this installment of //Source Dive//, we're back in xv6, learning how address translation works with the virtual memory subsystem. =[ 🔗 Links 🔗 ]= more in depth talk: ua-cam.com/video/dFIqNZ8VbRY/v-deo.htmlsi=ZGKcZRex96AUtwlT 🐋 RISC-V Docker Image: github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv-toolchain-docker 🎥 Series Playlist: 🗣 Discord: discord.gg/FPWaVgk ⭐️ Patreon: www....
Turning Pixels Into Waves
Переглядів 8 тис.6 місяців тому
In this video, we're building an awesome graphical effect, where an image is processed into a series of animated waves. The math behind the technique is fascinating, and will lead us into to how sine waves work, the magic of linear interpolation, and signal processing techniques like amplitude modulation! =[ 🔗 Links 🔗 ]= 🗣 Discord: discord.gg/FPWaVgk ⭐️ Patreon: www.patreon.com/lowleveljavascri...
How does KERNEL memory allocation work? //Source Dive// 004
Переглядів 44 тис.7 місяців тому
In this installment of //Source Dive//, we're deep in the xv6 operating system, trying to understand how physical memory of the system is tracked, distributed, and returned to the kernel. It's a fascinatingly simple algorithm, which can be paradoxically kind of hard to understand! =[ 🔗 Links 🔗 ]= 🐋 RISC-V Docker Image: github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv-toolchain-do...
Virtual Console and printf() //Source Dive// 003
Переглядів 63 тис.7 місяців тому
In this installment of //Source Dive//, we're back in xv6, looking at how the operating system layers abstractions. The "console" is a great example, with a low-level driver rooted in the hardware, to an abstract console, to the printf function that eventually outputs characters to the screen. =[ 🔗 Links 🔗 ]= 🐋 RISC-V Docker Image: github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv...
Programmatic Painting: Flow Fields
Переглядів 5 тис.7 місяців тому
In this video, we're drawing generative art in the form of flow fields! Flow fields are mathematical structures where every point of a space is associated with an angle, and by carefully choosing those angles, we can trace out the path of particles moving across the field, creating some beautiful images. =[ 🔗 Links 🔗 ]= 🗣 Discord: discord.gg/FPWaVgk ⭐️ Patreon: www.patreon.com/lowleveljavascrip...
What is a spinlock? //Source Dive// 002
Переглядів 42 тис.8 місяців тому
In this installment of //Source Dive//, we're back in the xv6 OS codebase, exploring timers, the early boot process, and a very useful concurrency primitive: The Spinlock! =[ 🔗 Links 🔗 ]= 🐋 RISC-V Docker Image: github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv-toolchain-docker 🎥 Series Playlist: 🗣 Discord: discord.gg/FPWaVgk ⭐️ Patreon: www.patreon.com/lowleveljavascript 💻 Github ...
How does an OS boot? //Source Dive// 001
Переглядів 366 тис.8 місяців тому
In this installment of //Source Dive//, we're learning about the xv6 Operating System; Specifically the low-level boot code that gets the CPU in the correct state to run the OS! =[ 🔗 Links 🔗 ]= 🐋 RISC-V Docker Image: github.com/francisrstokes/rv-toolchain-docker/pkgs/container/rv-toolchain-docker 🎥 Series Playlist: 🗣 Discord: discord.gg/FPWaVgk ⭐️ Patreon: www.patreon.com/lowleveljavascript 💻 G...
Cryptographically Signed Firmware :: Bare Metal Programming Series 14
Переглядів 6 тис.9 місяців тому
In the final episode of the Bare Metal Programming Series, we're implementing signed firmware updates! Everything from using AES in the CBC-MAC configuration in the bootloader, to writing a signing application, to updating the firmware updater to work with the new images. And of course, where would we be without a false celebration before the ultimate solution 😉 =[ 🔗 Links 🔗 ]= AES Blog Post: g...
Understanding AES Encryption Mechanics: BMPS
Переглядів 5 тис.9 місяців тому
In this video we're taking some time to grok the mechanics of AES. We cover the core operations of the algorithm, the mathematics of finite fields, and the all-important modes of operation. =[ 🔗 Links 🔗 ]= AES Blog Post: github.com/francisrstokes/githublog/blob/main/2022/6/15/rolling-your-own-crypto-aes.md Spec: nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf Deeper justifications and analysis...
Maintaining Firmware Integrity :: Bare Metal Programming Series 12
Переглядів 2,6 тис.10 місяців тому
Maintaining Firmware Integrity :: Bare Metal Programming Series 12
First Successful Firmware Update! :: Bare Metal Programming Series 11
Переглядів 3,2 тис.10 місяців тому
First Successful Firmware Update! :: Bare Metal Programming Series 11
Bootloader Firmware Update Mechanism :: Bare Metal Programming Series 10
Переглядів 3,4 тис.10 місяців тому
Bootloader Firmware Update Mechanism :: Bare Metal Programming Series 10
Simple Timer API :: Bare Metal Programming Series 9
Переглядів 2,5 тис.11 місяців тому
Simple Timer API :: Bare Metal Programming Series 9
Programmatic Flash Control :: Bare Metal Programming Series 8
Переглядів 2,5 тис.11 місяців тому
Programmatic Flash Control :: Bare Metal Programming Series 8
Testing the Packet Protocol :: Bare Metal Programming Series 7.3
Переглядів 3,2 тис.11 місяців тому
Testing the Packet Protocol :: Bare Metal Programming Series 7.3
Bootloader Packet Protocol Implementation :: Bare Metal Programming Series 7.2
Переглядів 3,6 тис.11 місяців тому
Bootloader Packet Protocol Implementation :: Bare Metal Programming Series 7.2
Designing A Packet Protocol :: Bare Metal Programming Series 7.1
Переглядів 4,6 тис.Рік тому
Designing A Packet Protocol :: Bare Metal Programming Series 7.1
Interrupt Safe Ring Buffer :: Bare Metal Programming Series 6
Переглядів 7 тис.Рік тому
Interrupt Safe Ring Buffer :: Bare Metal Programming Series 6
UART Driver From Scratch :: Bare Metal Programming Series 5
Переглядів 14 тис.Рік тому
UART Driver From Scratch :: Bare Metal Programming Series 5
Understanding Assembly Generated From C :: Bare Metal Programming Series 4.1
Переглядів 5 тис.Рік тому
Understanding Assembly Generated From C :: Bare Metal Programming Series 4.1
Worlds Simplest Bootloader :: Bare Metal Programming Series 4
Переглядів 17 тис.Рік тому
Worlds Simplest Bootloader :: Bare Metal Programming Series 4
PWM and Timers :: Bare Metal Programming Series 3
Переглядів 8 тис.Рік тому
PWM and Timers :: Bare Metal Programming Series 3
Interrupts and Memory Mapped I/O :: Bare Metal Programming Series 2
Переглядів 14 тис.Рік тому
Interrupts and Memory Mapped I/O :: Bare Metal Programming Series 2
Hello World Blinky! Bare Metal Programming Series 1
Переглядів 25 тис.Рік тому
Hello World Blinky! Bare Metal Programming Series 1
Bare Metal Programming Series 0
Переглядів 39 тис.Рік тому
Bare Metal Programming Series 0
Hiding Data In Sound
Переглядів 8 тис.Рік тому
Hiding Data In Sound

КОМЕНТАРІ

  • @andyschneider6402
    @andyschneider6402 8 годин тому

    Is it possible that the fact the nop instructions don’t consume time consistently as you add them is because a NOP on ARM is not guaranteed to consume time, the processor is allowed to remove them from the pipeline?

  • @Knirin
    @Knirin День тому

    I am a bit in the latter camp. You can write an assembler, compiler, or CPU in JavaScript. Please don’t run around screaming that it is the best tool for that job. I start getting upset when people go doable in language X means language X is the best possible tool for job Y. If you boil most tasks down enough they turn into finite state machines. That doesn’t mean an FSM is the most productive way of tackling a task. I am finding other videos pretty cool.

  • @nceban2136
    @nceban2136 День тому

    Pdos? Clergy's favourite OS

  • @Somali-iv9pu
    @Somali-iv9pu День тому

    hmmm i guess 5 dislikes were having a very bad day xd. thanks alot sir for sharing you knowledge with us, i cant wait to finish all of it 🙏🙏do you suggest books or certifications!

  • @yvesbaumes
    @yvesbaumes День тому

    Great video! Thank you very much for such high quality content. One question though: The `start` function is written in C. Which means it has a functioning stack somewhere. I guess that is the purpose of `_entry` assembly function to prepare the stack for `start`. How does the c code (or the c compiler) know that the stack must begin at `stack0 + hartid * 4096` for the `start` function?

  • @dr3dr3-nb9mp
    @dr3dr3-nb9mp 3 дні тому

    libopencm3 won't compile on window. Error with the nvic.h linker line 63: from the make file. Did anyone have a work around this since the include Header file is dynamic link

  • @retrojames4226
    @retrojames4226 3 дні тому

    No unit tests?

  • @rajsahu4644
    @rajsahu4644 3 дні тому

    ❤❤❤❤

  • @Klio_Ukranian
    @Klio_Ukranian 5 днів тому

  • @TheodorMoroianu
    @TheodorMoroianu 6 днів тому

    Best *nix series on youtube by far!! I really hope there will be a continuation!

  • @torcher5023
    @torcher5023 7 днів тому

    11:46 just use desmos to illustrate concept lol

  • @krishnababu5190
    @krishnababu5190 7 днів тому

    Generally kalloc(size_t sz) takes the size of memory to allocate, but in this os code why kallaoc(void) suppose if i want to allocate memory for a structure of 25 bytes, I get whole 4096 bytes, Is this inefficient Correct me if I am wrong

    • @LowByteProductions
      @LowByteProductions 7 днів тому

      kalloc is a page allocator, so yes it always returns 4096 bytes. You can build a finer grained allocator on top of this mechanism.

    • @krishnababu5190
      @krishnababu5190 7 днів тому

      Ok Thanks. I am comparing this page allocator (kmalloc) API with linux kernel kmalloc API. Thanks for pointing out😊.

  • @RomanShchekin
    @RomanShchekin 8 днів тому

    This is simply amazing! Best OS explaining video I've seen so far. Thank you so much and please keep it up!

  • @krishnababu5190
    @krishnababu5190 8 днів тому

    Too Interesting Please continue the series😊

  • @rayquazaboladao
    @rayquazaboladao 10 днів тому

    Another way to define a expression is as: expr: term ("*" term)* term: factor (("+"|'-") factor)* factor: literal | variable | "(" expr ")"

  • @12rjig13gb
    @12rjig13gb 11 днів тому

    in the uart_usr, shouldn't the if statement check for !overrun ?

  • @Georetic
    @Georetic 12 днів тому

    nice video

  • @jamalal7357
    @jamalal7357 12 днів тому

    I guess how do you know what is needed to boot the kernel and all the steps required for the architecture? Is there a manual that describes all of that?

  • @w6wdh
    @w6wdh 13 днів тому

    24:55 Question: initlock() is passed a pointer to a string (“cons” for example) with type (char *) to retain that information for debugging. But that points to a string in the caller’s data. Can you be sure that the string persists? If it is ephemeral, the pointer would no longer be valid. Do you have to do anything in the code calling initlock() to ensure that the string can always be accessed with the original pointer value? (And yes, this series of videos is amazing. Instant subscription. I’m retired so I no longer write code for embedded CPUs, but your explanations are a delight to follow.)

  • @SumitAdep
    @SumitAdep 14 днів тому

    well explained

  • @dengdaley
    @dengdaley 14 днів тому

    excellent tutors! could you share your vscode experience for another video?

  • @yonahcitron226
    @yonahcitron226 15 днів тому

    A master teacher. Thank you!

  • @SS-lm1ql
    @SS-lm1ql 16 днів тому

    Such excellent videos! I havent programmed in a while but this video made me curious so I cloned the project and am playing with xv6 now. Note that instead of the huge Docker image you provided, on my Mac I was able to 'brew' the x-toolchain as described on the MIT project page. Was able to untangle the pointer acrobatics of kinit() by printing out the first 8 bytes at the beginning of every page. The first page seems to have all zero bytes at the beginning (forming the NULL pointer) while the first 8 bytes of subsequent pages point back to the starting location in memory of the previous page. Very cool to see how it works.

  • @mariocampos7436
    @mariocampos7436 16 днів тому

    I LOVE this series! Please make more!

  • @bafellah9727
    @bafellah9727 17 днів тому

    A nice explanation, just one point, the executor function passed to the promise run immediately after creating the promise

  • @kernv0llig
    @kernv0llig 17 днів тому

    Love this! I was a ASM programmer for PIC microcontrollers in the early 2000's and it rendered me a nice career. I still miss those days, now working with cloud code...

    • @Somali-iv9pu
      @Somali-iv9pu День тому

      😢. what do cloud programmers do? i guessyou still write c or rust?

  • @TimDrogin
    @TimDrogin 17 днів тому

    I might be wrong, but 55 bits for addressing is 2^55 or 4 petabytes of addresses? 256 petabytes of potential ram is indeed a really big number!

  • @hkhj139
    @hkhj139 21 день тому

    The humans

  • @F0F0717
    @F0F0717 24 дні тому

    I’m not specialist with computer or even coding , these all are new information for me , i think i took more additional formation Thank you so much 🙏🏼

  • @taotuo
    @taotuo 27 днів тому

    please keep updating!!!!

  • @lewa_j
    @lewa_j 28 днів тому

    This series is awesome. I really hope for continuation

  • @patlollasrujan8493
    @patlollasrujan8493 29 днів тому

    Loved these videos, these are rare content. Keep continuing the good work❤

  • @25.muhammadhilmihaidary60
    @25.muhammadhilmihaidary60 Місяць тому

    i love you

  • @rnishu_7218
    @rnishu_7218 Місяць тому

    Please do one on OpenSSL!

  • @johnnywilliams2641
    @johnnywilliams2641 Місяць тому

    awesome

  • @R.Daneel
    @R.Daneel Місяць тому

    There are very few spots in the video where increasing your font size by 50-75% would cause any issues whatsoever... and it would help incredibly on small screens and old eyes.

  • @R.Daneel
    @R.Daneel Місяць тому

    As said frequently below: amazing video. You do need to lock the focus on your camera though!

  • @user-in5vf3ll8h
    @user-in5vf3ll8h Місяць тому

    Are PEG Parsers also Parser Combinator ?

  • @antonionotbanderas9775
    @antonionotbanderas9775 Місяць тому

    In the search for the easiest game engine I ended up learning about Turing machines, Vonn Newman architechture, assembly language, and Virtual Machines.

  • @husseinelsherbini6148
    @husseinelsherbini6148 Місяць тому

    j link > stlink

  • @Dr.Logistik
    @Dr.Logistik Місяць тому

    YT algorithm finally suggested something good :). Smashed that subscribe button!

  • @onaecO
    @onaecO Місяць тому

    Gold Mine!

  • @aabramek
    @aabramek Місяць тому

    shouldn't ring buffer stucture be marked as volatile since it is accessed and modified from both interrupt routine and main loop ?

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy Місяць тому

    2:12 makefile

  • @nhanNguyen-wo8fy
    @nhanNguyen-wo8fy Місяць тому

    10:30 flash memory 15:50 fix make file 17:10 what bootloader do 50:40 main 59:30 vector table offset register

  • @typedeaf
    @typedeaf Місяць тому

    Nice video. The heap metadata for modern OS's is more complicted to accomodate for improving availabilty, fragmentation, etc. This singlely-linked list is generally used for 'fast bins'; bins of small chunks of memory that are too small to worry about optimization on. The main question I have, is why did they call the structure for this memory metadata 'run'? What a terrible name for the memory allocation metadata.

  • @justinjools
    @justinjools Місяць тому

    I installed the repository but am getting this error ffor the app: # Build the main application firmware cd app make $ make src/bootloader.S: Assembler messages: src/bootloader.S:3: Error: file not found: ../bootloader/bootloader.bin make: *** [Makefile:171: src/bootloader.o] Error 1

  • @aliksargsyan2782
    @aliksargsyan2782 Місяць тому

    to write javascript on hardware level is completely nonsense. I'm sorry bro but this tutorial is completely out of logic

    • @LowByteProductions
      @LowByteProductions Місяць тому

      Literally anything to back that up? Just saying "nonsense" and "out of logic" doesn't make it so.

    • @aliksargsyan2782
      @aliksargsyan2782 Місяць тому

      @@LowByteProductions brother every language should serve its own purpose. If you want to progrman cpu os kernel something like that you shoyld not use typescript for that, your content is education purpose personally me I'm inteteseted embedded system development and to build that typescript is nonsense for. Just imagin you have BMW with price of 25000$ and then you plug trailer for uploading box of grass that job should do tractor not bmw. To build hardware level app with typescript is just same as I mentioned above

  • @jaime7295
    @jaime7295 Місяць тому

    Are you going to continue the xv6 source code dive series??

  • @justinjools
    @justinjools Місяць тому

    When I run make I get the following errors. Seems the Makefile isn't finding something. make[1]: arm-none-eabi-gcc: No such file or directory make[1]: *** [../Makefile.include:41: can.o] Error 127 Failure building: lib/efm32/ezr32wg: code: 2 Failure building: lib/efm32/g: code: 2 Failure building: lib/efm32/gg: code: 2

    • @LowByteProductions
      @LowByteProductions Місяць тому

      Seems like the arm gcc tool chain is not properly set up. If you have installed it, make sure it's in your path.

    • @justinjools
      @justinjools Місяць тому

      @@LowByteProductions Thanks. I installed Arm GNU Toolchain to the root of Msys2 and used this path. export PATH="$PATH:/Arm GNU Toolchain arm-none-eabi/bin/" cd libopencm3 make ...