<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[DIY Electronic projects - Embedded]]></title>
		<link>https://forum.yu3ma.net/</link>
		<description><![CDATA[DIY Electronic projects - https://forum.yu3ma.net]]></description>
		<pubDate>Tue, 26 May 2026 04:14:12 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[McObjects eXtremeDB/rt 2.0]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=3081</link>
			<pubDate>Mon, 08 Dec 2025 19:33:13 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=107">mikikg</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=3081</guid>
			<description><![CDATA[Na zadnjem skupu KG2025 je bilo malo reči i o McObject i eXtremeDB bazi podataka kao uvod u jedno poglavljnje specializovanih embedded baza podataka za male IoT/Edge uredjaje.<br />
<br />
U nastavku priča sa oficialnog ST-ovg blog o tome kako se eXtremeDB baza podataka može efikasno upotrebiti na STM32 single/dual core procesorima za asimetrično (opciono i simetrično) procesiranje.<br />
<br />
Tema je dosta široka i vezana je generalno za baze podataka ali za razliku od dosta drugih konkuretnih proizovda eXtremeDB je jedini RDBMS koji je potpuno prilagodljiv do najjmanjeg detalja, jezgro baze je konfigurabilno i sve ostalo povezano sa tim, može a i ne mora da se koristi SQL (istovremeno je SQL/NoSQL), tablice mogu da se prave u compile-time, vektorske veze i pointeri, replikacija i sve ostalo sto moderne baze imaju samo ova jedino radi na EMBEDDED platformama kako treba i ima izuzetne perfomanse sa podrškom za time-critical operacije.  <br />
<br />
eXtremeDB je komercialni proizvod, sastoji se od paketa usluga, SDK za razvoj sa/bez source-code za izabranu platformu/jezik (C, Go, Python, C# itd) i opciono (vrlo stručne) tehničke porške. <br />
SDK pordžava sko sve arhitekture procesora i odprilike je jedina baza na tržištu koja pored klasičnih *nix/Win OS može da radi dodatno i na RTOS (ZephyrOS, freeRTOS) ili čak bare-metal!<br />
<br />
eXtremeDB/rt 2.0, All the reasons why embedded systems need a database, now with persistence<br />
<a href="https://blog.st.com/extremedb/" target="_blank" rel="noopener" class='oembed'>https://blog.st.com/extremedb/</a><br />
<br />
<img src="https://forum.yu3ma.net/attachment.php?aid=47025" loading="lazy"  alt="[Image: attachment.php?aid=47025]" class="mycode_img" /><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.yu3ma.net/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=47025" target="_blank" title="">Shared-Data-in-AMP-configurations-June-2025.jpg</a> (Size: 67,24 KB / Downloads: 37)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Na zadnjem skupu KG2025 je bilo malo reči i o McObject i eXtremeDB bazi podataka kao uvod u jedno poglavljnje specializovanih embedded baza podataka za male IoT/Edge uredjaje.<br />
<br />
U nastavku priča sa oficialnog ST-ovg blog o tome kako se eXtremeDB baza podataka može efikasno upotrebiti na STM32 single/dual core procesorima za asimetrično (opciono i simetrično) procesiranje.<br />
<br />
Tema je dosta široka i vezana je generalno za baze podataka ali za razliku od dosta drugih konkuretnih proizovda eXtremeDB je jedini RDBMS koji je potpuno prilagodljiv do najjmanjeg detalja, jezgro baze je konfigurabilno i sve ostalo povezano sa tim, može a i ne mora da se koristi SQL (istovremeno je SQL/NoSQL), tablice mogu da se prave u compile-time, vektorske veze i pointeri, replikacija i sve ostalo sto moderne baze imaju samo ova jedino radi na EMBEDDED platformama kako treba i ima izuzetne perfomanse sa podrškom za time-critical operacije.  <br />
<br />
eXtremeDB je komercialni proizvod, sastoji se od paketa usluga, SDK za razvoj sa/bez source-code za izabranu platformu/jezik (C, Go, Python, C# itd) i opciono (vrlo stručne) tehničke porške. <br />
SDK pordžava sko sve arhitekture procesora i odprilike je jedina baza na tržištu koja pored klasičnih *nix/Win OS može da radi dodatno i na RTOS (ZephyrOS, freeRTOS) ili čak bare-metal!<br />
<br />
eXtremeDB/rt 2.0, All the reasons why embedded systems need a database, now with persistence<br />
<a href="https://blog.st.com/extremedb/" target="_blank" rel="noopener" class='oembed'>https://blog.st.com/extremedb/</a><br />
<br />
<img src="https://forum.yu3ma.net/attachment.php?aid=47025" loading="lazy"  alt="[Image: attachment.php?aid=47025]" class="mycode_img" /><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.yu3ma.net/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=47025" target="_blank" title="">Shared-Data-in-AMP-configurations-June-2025.jpg</a> (Size: 67,24 KB / Downloads: 37)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[RGB 7-segment LED displej]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=2938</link>
			<pubDate>Thu, 04 Jul 2024 12:15:27 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=804">ognjan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=2938</guid>
			<description><![CDATA[<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.yu3ma.net/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=43156" target="_blank" title="">RGB_7seg.jpg</a> (Size: 68,3 KB / Downloads: 24)
<!-- end: postbit_attachments_attachment --><br />
<br />
   Da li je ko radio sa RGB 7-segmentnim displejima ?  Zanima me kakav drajver je najzgodnije koristiti za ovo, ako neko ima<br />
konkretna iskustva ?  <br />
  Sve skupa ce pokretati neki STM32, tako da nije problem ni PWM, ili eventalno neki IC sa SPI komunikacijom, koji bi imao sve sto treba upakovano...]]></description>
			<content:encoded><![CDATA[<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.yu3ma.net/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=43156" target="_blank" title="">RGB_7seg.jpg</a> (Size: 68,3 KB / Downloads: 24)
<!-- end: postbit_attachments_attachment --><br />
<br />
   Da li je ko radio sa RGB 7-segmentnim displejima ?  Zanima me kakav drajver je najzgodnije koristiti za ovo, ako neko ima<br />
konkretna iskustva ?  <br />
  Sve skupa ce pokretati neki STM32, tako da nije problem ni PWM, ili eventalno neki IC sa SPI komunikacijom, koji bi imao sve sto treba upakovano...]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Celeron compact flash]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=2551</link>
			<pubDate>Wed, 17 Mar 2021 08:46:30 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=889">Sir Oliver</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=2551</guid>
			<description><![CDATA[Pozdrav drugari, <span style="font-weight: bold;" class="mycode_b">HELP WANTED!</span><br />
Radi se o sledećem.<br />
Komp je sa Celeronom sa 2GB RAMa (maximum). Na matičnoj postoji Compact Flash konektor za boot device i ništa više! <img src="https://forum.yu3ma.net/images/smilies/huh.gif" alt="Huh" title="Huh" class="smilie smilie_17" /><br />
Ni SATA ni IDE. USB konektor na ploči ne postoji, samo pinčići da se nabode neki kabl sa USB A konektorima pa da se pristupi. Priključio spoljni CD i bootujem sa njega, dakle radi.<br />
Ima i Touch Panel 15" u portret orijentaciji.<br />
<br />
Potrebno je napraviti embedded sistem. Šta predlažete?<br />
<br />
1 CF card 4 (8) GB i Volumio?  Da li Volumio podržava Touch i portret orijentaciju?<br />
<br />
2 Windows 7 embedded? Da li CF zbog ograničenog broja R/W ciklusa odgovara ovoj nameni? Koji kapacitet CFa je potreban za WIN 7? Ima li neke cake kod instaliranja Win 7  na CF karticu? Nije li Celeron slab za Win 7?<br />
<br />
Da li postoji neki HDD ili SSD sa compact flash konektorom? Adapter da se HDD (SSD) ubode u compact flash?<br />
Da li je primenjiv CF to SD adapter. Da li SD kartica može da bude boot medijum?<br />
 Kakvi su oni HDDovi iz iPoda? (1,8 ") mogu li da se ubodu u CF? Mislim na CF hard diskove. npr  MK8007GAH CF Hard Drive<br />
<br />
Ima li neko na probu takav disk? Ili skršen iPod?]]></description>
			<content:encoded><![CDATA[Pozdrav drugari, <span style="font-weight: bold;" class="mycode_b">HELP WANTED!</span><br />
Radi se o sledećem.<br />
Komp je sa Celeronom sa 2GB RAMa (maximum). Na matičnoj postoji Compact Flash konektor za boot device i ništa više! <img src="https://forum.yu3ma.net/images/smilies/huh.gif" alt="Huh" title="Huh" class="smilie smilie_17" /><br />
Ni SATA ni IDE. USB konektor na ploči ne postoji, samo pinčići da se nabode neki kabl sa USB A konektorima pa da se pristupi. Priključio spoljni CD i bootujem sa njega, dakle radi.<br />
Ima i Touch Panel 15" u portret orijentaciji.<br />
<br />
Potrebno je napraviti embedded sistem. Šta predlažete?<br />
<br />
1 CF card 4 (8) GB i Volumio?  Da li Volumio podržava Touch i portret orijentaciju?<br />
<br />
2 Windows 7 embedded? Da li CF zbog ograničenog broja R/W ciklusa odgovara ovoj nameni? Koji kapacitet CFa je potreban za WIN 7? Ima li neke cake kod instaliranja Win 7  na CF karticu? Nije li Celeron slab za Win 7?<br />
<br />
Da li postoji neki HDD ili SSD sa compact flash konektorom? Adapter da se HDD (SSD) ubode u compact flash?<br />
Da li je primenjiv CF to SD adapter. Da li SD kartica može da bude boot medijum?<br />
 Kakvi su oni HDDovi iz iPoda? (1,8 ") mogu li da se ubodu u CF? Mislim na CF hard diskove. npr  MK8007GAH CF Hard Drive<br />
<br />
Ima li neko na probu takav disk? Ili skršen iPod?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Pisanje modula za NGINX]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=2484</link>
			<pubDate>Tue, 03 Nov 2020 12:51:53 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=107">mikikg</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=2484</guid>
			<description><![CDATA[Evo jeda tema koja mozda nekome nekada moze da zatreba.<br />
<br />
Imao sam potrebu da nekoliko RPi-a trebaju da razmenjuju izmedju sebe relativno malu kolicinu podataka (&lt;1KB) ali relativno cesto (do 25 puta u sekundi) u lokalnoj mrezi (nema internet/gateway).<br />
<br />
Posle vise pokusaja kako to da resim odlucio sam se da izaberem NGINX (HTTP protokol) koji se pokazao kao uzezetno robustan, pouzdan i veoma veoma brz.<br />
Samo mali podsetnik, NGINX web server gura odprilike 50% kopletnog interneta na svetu ukljucujuci i ovaj nas forum, to je veoma ozbiljno napisan software!<br />
<br />
Pre ovoga sam pokusavao da resim to sa *nix soketima, stalna veza koja pljucka te podatke ali se ispostavilo da je prilicno slozeno da se "izhendluju" sve potrebne situacije oko toga, radi ali je sklono zaglupljivanju.<br />
<br />
Dakle izbor je pao na NGINX i varijanta da se napravi poseban modul za njega kako bih dobio na brzini procesiranja i to uvezano preko "deljene memorije" (/dev/shm), bez i jednog FILE I/O, dakle da sve radi iz memorije ...<br />
<br />
I napravio sam tako, relativno je prosto da se odradi, sve se moze spakovati u jednu C skriptu i jedan konfiguracioni fajl za sam modul.<br />
<br />
Naravno neophodno je da osposobite okruzenje za prevodjenje celog NGINX source code-a + instalirati zavisne biblioteke (zlib, OpenSSL opciono, i jos nesto zaboravih sta) i konfigurisati build skriptu da povuce i source za taj nas modul.<br />
Dodatno je potrebno samo podesiti nginx.conf da "slusa" na odredjenoj IP : PORT i postaviti "rutu" da "gadja" nas nov modul.<br />
<br />
Na ovoj adresi ima primer sa source-code za "hello_world_module":<br />
<a href="https://github.com/perusio/nginx-hello-world-module" target="_blank" rel="noopener" class='oembed'>https://github.com/perusio/nginx-hello-world-module</a><br />
<br />
E sad, drugi deo price je "klient", sta tu sad staviti ali na srecu tu nisam imao mnogo nedoumica bar kada je HTTP u pitanju i za te potrebe sam iskoristio libCurl, cuvena biblioteka koja je isto jako dugo u upotrebi i to je "proverena stvar", sa tim nema brige.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Zakljucak, NGINX za server i libCurl za klienta radi odlicno.</span> Dobio sam rezultate reda 1-2ms za potrebno vreme procesiranja celog upita (slanje upita i citanje odgovora) sto meni zavrsava posao a oslonio sam se na proverene/poznate biblioteke koje se lako implementiraju.<br />
<br />
Koga interesuju vise detalja oko ovoga neka slobodno pita ...]]></description>
			<content:encoded><![CDATA[Evo jeda tema koja mozda nekome nekada moze da zatreba.<br />
<br />
Imao sam potrebu da nekoliko RPi-a trebaju da razmenjuju izmedju sebe relativno malu kolicinu podataka (&lt;1KB) ali relativno cesto (do 25 puta u sekundi) u lokalnoj mrezi (nema internet/gateway).<br />
<br />
Posle vise pokusaja kako to da resim odlucio sam se da izaberem NGINX (HTTP protokol) koji se pokazao kao uzezetno robustan, pouzdan i veoma veoma brz.<br />
Samo mali podsetnik, NGINX web server gura odprilike 50% kopletnog interneta na svetu ukljucujuci i ovaj nas forum, to je veoma ozbiljno napisan software!<br />
<br />
Pre ovoga sam pokusavao da resim to sa *nix soketima, stalna veza koja pljucka te podatke ali se ispostavilo da je prilicno slozeno da se "izhendluju" sve potrebne situacije oko toga, radi ali je sklono zaglupljivanju.<br />
<br />
Dakle izbor je pao na NGINX i varijanta da se napravi poseban modul za njega kako bih dobio na brzini procesiranja i to uvezano preko "deljene memorije" (/dev/shm), bez i jednog FILE I/O, dakle da sve radi iz memorije ...<br />
<br />
I napravio sam tako, relativno je prosto da se odradi, sve se moze spakovati u jednu C skriptu i jedan konfiguracioni fajl za sam modul.<br />
<br />
Naravno neophodno je da osposobite okruzenje za prevodjenje celog NGINX source code-a + instalirati zavisne biblioteke (zlib, OpenSSL opciono, i jos nesto zaboravih sta) i konfigurisati build skriptu da povuce i source za taj nas modul.<br />
Dodatno je potrebno samo podesiti nginx.conf da "slusa" na odredjenoj IP : PORT i postaviti "rutu" da "gadja" nas nov modul.<br />
<br />
Na ovoj adresi ima primer sa source-code za "hello_world_module":<br />
<a href="https://github.com/perusio/nginx-hello-world-module" target="_blank" rel="noopener" class='oembed'>https://github.com/perusio/nginx-hello-world-module</a><br />
<br />
E sad, drugi deo price je "klient", sta tu sad staviti ali na srecu tu nisam imao mnogo nedoumica bar kada je HTTP u pitanju i za te potrebe sam iskoristio libCurl, cuvena biblioteka koja je isto jako dugo u upotrebi i to je "proverena stvar", sa tim nema brige.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Zakljucak, NGINX za server i libCurl za klienta radi odlicno.</span> Dobio sam rezultate reda 1-2ms za potrebno vreme procesiranja celog upita (slanje upita i citanje odgovora) sto meni zavrsava posao a oslonio sam se na proverene/poznate biblioteke koje se lako implementiraju.<br />
<br />
Koga interesuju vise detalja oko ovoga neka slobodno pita ...]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[COM port sniffer za WIN10]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=2377</link>
			<pubDate>Thu, 16 Apr 2020 07:00:50 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=757">gorankg</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=2377</guid>
			<description><![CDATA[Treba da na brzinu pregledam neku komunikaciju na COM portu a sve što sam imao u tu svrhu mi sada ne radi zbog isteka licenci ili win10. Da li neko ima free rešenje?]]></description>
			<content:encoded><![CDATA[Treba da na brzinu pregledam neku komunikaciju na COM portu a sve što sam imao u tu svrhu mi sada ne radi zbog isteka licenci ili win10. Da li neko ima free rešenje?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Asinhrono citanje sa USB-serial problem | Android/Java]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=2361</link>
			<pubDate>Mon, 30 Mar 2020 19:00:31 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=107">mikikg</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=2361</guid>
			<description><![CDATA[Pozdrav,<br />
<br />
imam dosta glup problem ali ne znam kako da ga resim.<br />
<br />
U pitanju je Android/Java i citanje sa seriskog USB porta.<br />
<br />
Problem je manje vise klasika, treba da primimim paket podataka koji je na zalost promenljive duzine. U samom paketu ima i informaciji o duzini (treci i cetvrti bajt). Paket uvek ima i start sekvencu (0xDA 0xDA, prvi i drugi bajt)<br />
<br />
Samo primanje se radi preko registrovane callback funkcije u nekom svom posebnom thread-u. Sve je to na nivou neke biblioteke viseg nivoa (baziranoj na Android API - Java).<br />
<br />
Moj code samo stigne na kraju u tu callback funkciju i na meni je dalja obrada, za sad printam sta je to stiglo.<br />
<br />
Evo prakticno "prepiska" izmedju Android-a i tog seriskog uredjaja i linija gde nastaje problem. Problem je 3. i 4. linija koja u stvari mora da bude jedan paket.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>1. 2020-03-30 19: 42 :19.957 1887-1887/com.example: TX &gt;&gt;&gt; DA DA 00 06 00 01 02 0A 0B 1E <br />
2. 2020-03-30 19: 42 :19.975 1887-1931/com.example: RX &lt;&lt;&lt; DA DA 00 0A 00 01 02 0A 0C 38 00 00 01 14 <br />
3. 2020-03-30 19: 42 :22.002 1887-1931/com.example: RX &lt;&lt;&lt; DA DA 00 0A 00 01 02 0A <br />
4. 2020-03-30 19: 42 :22.018 1887-1931/com.example: RX &lt;&lt;&lt; 0A 37 00 00 01 15 <br />
5. 2020-03-30 19: 42 :22.354 1887-1931/com.example: RX &lt;&lt;&lt; DA DA 00 06 00 01 02 0A 14 27 </blockquote>
<br />
Treba da "rekonstrusem" paket, da spojim te delove koji su primljeni iz dva puta u jedan da bih mogao dalje da procesiram.<br />
<br />
Mozete da predlozite i resenje u nekom pseudo codu, samo da vidim logiku kako to sve da odradim.]]></description>
			<content:encoded><![CDATA[Pozdrav,<br />
<br />
imam dosta glup problem ali ne znam kako da ga resim.<br />
<br />
U pitanju je Android/Java i citanje sa seriskog USB porta.<br />
<br />
Problem je manje vise klasika, treba da primimim paket podataka koji je na zalost promenljive duzine. U samom paketu ima i informaciji o duzini (treci i cetvrti bajt). Paket uvek ima i start sekvencu (0xDA 0xDA, prvi i drugi bajt)<br />
<br />
Samo primanje se radi preko registrovane callback funkcije u nekom svom posebnom thread-u. Sve je to na nivou neke biblioteke viseg nivoa (baziranoj na Android API - Java).<br />
<br />
Moj code samo stigne na kraju u tu callback funkciju i na meni je dalja obrada, za sad printam sta je to stiglo.<br />
<br />
Evo prakticno "prepiska" izmedju Android-a i tog seriskog uredjaja i linija gde nastaje problem. Problem je 3. i 4. linija koja u stvari mora da bude jedan paket.<br />
<br />
<blockquote class="mycode_quote"><cite>Quote:</cite>1. 2020-03-30 19: 42 :19.957 1887-1887/com.example: TX &gt;&gt;&gt; DA DA 00 06 00 01 02 0A 0B 1E <br />
2. 2020-03-30 19: 42 :19.975 1887-1931/com.example: RX &lt;&lt;&lt; DA DA 00 0A 00 01 02 0A 0C 38 00 00 01 14 <br />
3. 2020-03-30 19: 42 :22.002 1887-1931/com.example: RX &lt;&lt;&lt; DA DA 00 0A 00 01 02 0A <br />
4. 2020-03-30 19: 42 :22.018 1887-1931/com.example: RX &lt;&lt;&lt; 0A 37 00 00 01 15 <br />
5. 2020-03-30 19: 42 :22.354 1887-1931/com.example: RX &lt;&lt;&lt; DA DA 00 06 00 01 02 0A 14 27 </blockquote>
<br />
Treba da "rekonstrusem" paket, da spojim te delove koji su primljeni iz dva puta u jedan da bih mogao dalje da procesiram.<br />
<br />
Mozete da predlozite i resenje u nekom pseudo codu, samo da vidim logiku kako to sve da odradim.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Moj repo sa Android glTF Viewer]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=2332</link>
			<pubDate>Fri, 24 Jan 2020 17:13:46 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=107">mikikg</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=2332</guid>
			<description><![CDATA[Da podelim sa vama moj novi repoziturijum sa Android aplikacijom za pregled <span style="font-weight: bold;" class="mycode_b">3D modela u glTF formatu</span>.<br />
<br />
<a href="https://github.com/mikikg/AndroidJgltfViewer" target="_blank" rel="noopener" class='oembed'>https://github.com/mikikg/AndroidJgltfViewer</a><br />
<br />
U pitanju je portovana desktop verzija biblioteke <span style="font-weight: bold;" class="mycode_b">jglTF</span> koju su izvorno pisali momci iz Khronos (OpenGL) grupe za Android okruzenje sa embedded verzijom OpenGL-a tj OpenGL ES 3.<br />
<br />
Probajte, testirajte, starujte, lajkujte, pitajte ... <img src="https://forum.yu3ma.net/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" />]]></description>
			<content:encoded><![CDATA[Da podelim sa vama moj novi repoziturijum sa Android aplikacijom za pregled <span style="font-weight: bold;" class="mycode_b">3D modela u glTF formatu</span>.<br />
<br />
<a href="https://github.com/mikikg/AndroidJgltfViewer" target="_blank" rel="noopener" class='oembed'>https://github.com/mikikg/AndroidJgltfViewer</a><br />
<br />
U pitanju je portovana desktop verzija biblioteke <span style="font-weight: bold;" class="mycode_b">jglTF</span> koju su izvorno pisali momci iz Khronos (OpenGL) grupe za Android okruzenje sa embedded verzijom OpenGL-a tj OpenGL ES 3.<br />
<br />
Probajte, testirajte, starujte, lajkujte, pitajte ... <img src="https://forum.yu3ma.net/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" />]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Pisanje kernel modula - Linux Kernel Module Programming]]></title>
			<link>https://forum.yu3ma.net/showthread.php?tid=981</link>
			<pubDate>Sun, 14 Jun 2015 19:53:57 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.yu3ma.net/member.php?action=profile&uid=107">mikikg</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.yu3ma.net/showthread.php?tid=981</guid>
			<description><![CDATA[Ovih dana sam experimentisao malo sa pisanjem Linux kernel modula (device driver) i dostavljam ovde jedan prost primer kao osnovu - skeleton.<br />
<br />
Ovde pokazujem jedan primer za "Character Device" (suprotno od "Block Device") driver, parce dinamickog programa koji se ucitava u kernel i koji operise sa tkz seriskim tipovima uredjaja, npr raznim komunikacioni portovi poput RS232, I2C, USB i slicno. <br />
Primetice te da nije uradjena fizicka komunikacija vec je ceo drajver napravljen kao "fake", tj moze u njega da se upisuje i posle da se iscitavaju podaci, kao da imamo prikacenu neku serisku memoriju od 100 bajtova ("virtual_device").<br />
<br />
Razvojno okruzenje je Linux Debian 8 sa potrebnim paketima (gcc, make, linux-headers …)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">hello.c</span> C++ source code (zanemarite PHP, iskorisceno za forum samo za highligh sintakse)<br />
<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #FF8000">/**********************************************************<br />***********************************************************<br />hello.c<br />***********************************************************<br />***********************************************************/<br /><br />#include&nbsp;&lt;linux/init.h&gt;&nbsp;//MUST<br />#include&nbsp;&lt;linux/module.h&gt;&nbsp;//MUST<br />#include&nbsp;&lt;linux/moduleparam.h&gt;&nbsp;//to&nbsp;pass&nbsp;params<br />#include&nbsp;&lt;linux/fs.h&gt;&nbsp;//File&nbsp;system&nbsp;operations,&nbsp;read/write,&nbsp;open/close&nbsp;device&nbsp;drivers<br />#include&nbsp;&lt;linux/cdev.h&gt;&nbsp;//characher&nbsp;device&nbsp;driver<br />#include&nbsp;&lt;linux/semaphore.h&gt;&nbsp;//used&nbsp;to&nbsp;access&nbsp;semaphores;&nbsp;sunchronization&nbsp;behaviors<br />#include&nbsp;&lt;asm/uaccess.h&gt;&nbsp;//copy_to_user;&nbsp;copy_from_user<br /><br />//other&nbsp;variables<br /></span><span style="color: #0000BB">struct&nbsp;cdev&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//my&nbsp;charachter&nbsp;device<br /></span><span style="color: #0000BB">int&nbsp;major_number</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//will&nbsp;store&nbsp;our&nbsp;major&nbsp;number&nbsp;-&nbsp;extracted&nbsp;from&nbsp;dev_t&nbsp;using&nbsp;macro&nbsp;-&nbsp;mknod&nbsp;/directory/files&nbsp;c&nbsp;major&nbsp;minor<br /></span><span style="color: #0000BB">int&nbsp;ret</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//used&nbsp;to&nbsp;hold&nbsp;return&nbsp;values&nbsp;of&nbsp;functions;&nbsp;this&nbsp;is&nbsp;because&nbsp;kernel&nbsp;stack&nbsp;is&nbsp;very&nbsp;small&nbsp;so&nbsp;declare&nbsp;variables&nbsp;all&nbsp;over&nbsp;the&nbsp;pass&nbsp;in&nbsp;our&nbsp;module&nbsp;functions&nbsp;eats&nbsp;up&nbsp;the&nbsp;stack&nbsp;very&nbsp;fast<br /></span><span style="color: #0000BB">dev_t&nbsp;dev_num</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;hold&nbsp;major&nbsp;naumber&nbsp;that&nbsp;kernel&nbsp;give&nbsp;us;&nbsp;name&nbsp;--&gt;&nbsp;apears&nbsp;in&nbsp;/proc/devices<br /><br />#define&nbsp;DEVICE_NAME&nbsp;"mikidev"<br /><br />//structure&nbsp;for&nbsp;device<br /></span><span style="color: #0000BB">struct&nbsp;fake_device&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">char&nbsp;data</span><span style="color: #007700">[</span><span style="color: #0000BB">100</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">struct&nbsp;semaphore&nbsp;sem</span><span style="color: #007700">;<br />}&nbsp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">;<br /><br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//***********************************************************/<br />//***********************************************************/<br /><br />//pass&nbsp;the&nbsp;params&nbsp;(not&nbsp;used&nbsp;now)<br /></span><span style="color: #0000BB">int&nbsp;my_param&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">module_param</span><span style="color: #007700">(</span><span style="color: #0000BB">my_param</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">int</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">S_IRUSR&nbsp;</span><span style="color: #007700">|&nbsp;</span><span style="color: #0000BB">S_IWUSR</span><span style="color: #007700">);<br /><br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//**********************&nbsp;device&nbsp;operation&nbsp; ******************/<br />//***********************************************************/<br /><br />//called&nbsp;on&nbsp;device_file&nbsp;open<br />//inode&nbsp;reference&nbsp;to&nbsp;the&nbsp;file&nbsp;on&nbsp;disk<br />//and&nbsp;contains&nbsp;information&nbsp;about&nbsp;the&nbsp;file<br />//struct&nbsp;files&nbsp;is&nbsp;represents&nbsp;an&nbsp;abstract&nbsp;open&nbsp;file<br /></span><span style="color: #0000BB">int&nbsp;device_open&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;inode&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">inode</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">struct&nbsp;file&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">filp</span><span style="color: #007700">)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//only&nbsp;allow&nbsp;one&nbsp;process&nbsp;to&nbsp;open&nbsp;this&nbsp;device&nbsp;by&nbsp;using&nbsp;semaphore&nbsp;as&nbsp;mutual&nbsp;exclusive&nbsp;lock&nbsp;-&nbsp;mutex<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">down_interruptible</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">sem</span><span style="color: #007700">)&nbsp;!=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;could&nbsp;not&nbsp;lock&nbsp;device&nbsp;during&nbsp;open"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"mikidev:&nbsp;opened&nbsp;device"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />}<br /><br /></span><span style="color: #0000BB">ssize_t&nbsp;device_read&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;file</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">filp</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">char</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">bufStoreData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">size_t&nbsp;bufCount</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">loff_t</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">curOffset</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//take&nbsp;the&nbsp;kernel&nbsp;space&nbsp;(device)&nbsp;to&nbsp;user&nbsp;space&nbsp;(process)<br />&nbsp;&nbsp;&nbsp;&nbsp;//copy_to_user&nbsp;(destiantion,&nbsp;source,&nbsp;sizeToTransfer)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;Reading&nbsp;from&nbsp;device"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">copy_to_user</span><span style="color: #007700">(</span><span style="color: #0000BB">bufStoreData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bufCount</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">ssize_t&nbsp;device_write&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;file</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">filp</span><span style="color: #007700">,&nbsp;const&nbsp;</span><span style="color: #0000BB">char</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">bufSourceData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">size_t&nbsp;bufCount</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">loff_t</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">curOffset</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//send&nbsp;data&nbsp;from&nbsp;user&nbsp;to&nbsp;kernel<br />&nbsp;&nbsp;&nbsp;&nbsp;//copy_from_user&nbsp;(destiantion,&nbsp;source,&nbsp;sizeToTransfer)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;Writng&nbsp;to&nbsp;device"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">copy_from_user</span><span style="color: #007700">(</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bufSourceData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bufCount</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">int&nbsp;device_close</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;inode&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">inode</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">struct&nbsp;file&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">filp</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//by&nbsp;calling&nbsp;up,&nbsp;whic&nbsp;is&nbsp;opposite&nbsp;of&nbsp;down&nbsp;for&nbsp;semaphore,&nbsp;we&nbsp;realease&nbsp;the&nbsp;mutex&nbsp;we&nbsp;obtained&nbsp;ad&nbsp;device&nbsp;open<br />&nbsp;&nbsp;&nbsp;&nbsp;//this&nbsp;has&nbsp;the&nbsp;effect&nbsp;of&nbsp;allowing&nbsp;other&nbsp;process&nbsp;to&nbsp;use&nbsp;the&nbsp;device&nbsp;now<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">up</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">sem</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;closed&nbsp;device"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">//tell&nbsp;the&nbsp;kernel&nbsp;which&nbsp;functions&nbsp;to&nbsp;call&nbsp;when&nbsp;user&nbsp;operates&nbsp;on&nbsp;our&nbsp;device&nbsp;file<br /></span><span style="color: #0000BB">struct&nbsp;file_operations&nbsp;fops&nbsp;</span><span style="color: #007700">=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000BB">owner&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">THIS_MODULE</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//prevent&nbsp;unloading&nbsp;of&nbsp;this&nbsp;module&nbsp;when&nbsp;operations&nbsp;are&nbsp;in&nbsp;use<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">open&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_open</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;opening&nbsp;the&nbsp;device<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">release&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_close</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;closing&nbsp;the&nbsp;device<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">write&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_write</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;writing&nbsp;the&nbsp;device<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">read&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_read&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;reading&nbsp;the&nbsp;device<br /></span><span style="color: #007700">};<br /><br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//**********************&nbsp;module&nbsp;operation&nbsp;*******************/<br />//***********************************************************/<br /></span><span style="color: #007700">static&nbsp;</span><span style="color: #0000BB">int&nbsp;driver_init&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">void</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//register&nbsp;our&nbsp;device&nbsp;with&nbsp;the&nbsp;system:&nbsp;a&nbsp;two&nbsp;step&nbsp;process<br />&nbsp;&nbsp;&nbsp;&nbsp;//step&nbsp;1&nbsp;use&nbsp;dynamic&nbsp;alloacation&nbsp;to&nbsp;assign&nbsp;our&nbsp;device&nbsp;a&nbsp;major&nbsp;number&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;--&nbsp;alloc_chrdev_region&nbsp;(dev_t*,&nbsp;uint&nbsp;fminor,&nbsp;uint&nbsp;count,&nbsp;char*&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">alloc_chrdev_region&nbsp;</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">,</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">&lt;&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{</span><span style="color: #FF8000">//alert&nbsp;time&nbsp;kernel&nbsp;functions&nbsp;return&nbsp;negatives,&nbsp;there&nbsp;is&nbsp;an&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;faild&nbsp;to&nbsp;allocate&nbsp;a&nbsp;major&nbsp;number"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//propagate&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">major_number&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">MAJOR</span><span style="color: #007700">(</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//extract&nbsp;the&nbsp;major&nbsp;number&nbsp;and&nbsp;store&nbsp;into&nbsp;our&nbsp;variables&nbsp;(MACRO)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;major&nbsp;number&nbsp;is&nbsp;%d"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">major_number</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"&#092;tuse&nbsp;&#092;"mknod&nbsp;/dev/%s&nbsp;c&nbsp;%d&nbsp;0&#092;"&nbsp;for&nbsp;device&nbsp;file"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">major_number</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//dmesg<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mcdev&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cdev_alloc</span><span style="color: #007700">();&nbsp;</span><span style="color: #FF8000">//create&nbsp;our&nbsp;cdev&nbsp;structure,&nbsp;initialize&nbsp;our&nbsp;cdev<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ops&nbsp;</span><span style="color: #007700">=&nbsp;&amp;</span><span style="color: #0000BB">fops</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//struct&nbsp;file_operations<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">owner&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">THIS_MODULE</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//now&nbsp;we&nbsp;created&nbsp;cdev,&nbsp;we&nbsp;have&nbsp;to&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;kernel<br />&nbsp;&nbsp;&nbsp;&nbsp;//int&nbsp;cdev_add(struct&nbsp;cdev*&nbsp;dev,&nbsp;dev_t&nbsp;num,&nbsp;unsigned&nbsp;int&nbsp;count)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cdev_add</span><span style="color: #007700">(</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">&lt;&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{&nbsp;</span><span style="color: #FF8000">//always&nbsp;check&nbsp;errors<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;unable&nbsp;to&nbsp;add&nbsp;cdev&nbsp;to&nbsp;kernel"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//initialise&nbsp;our&nbsp;semaphore<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">sema_init&nbsp;</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">sem</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//initial&nbsp;values&nbsp;of&nbsp;one<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br /><br />static&nbsp;</span><span style="color: #0000BB">void&nbsp;driver_exit&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">void</span><span style="color: #007700">)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//unregister&nbsp;evrything&nbsp;in&nbsp;reverse&nbsp;order<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">cdev_del</span><span style="color: #007700">(</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">unregister_chrdev_region</span><span style="color: #007700">(</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;unloaded&nbsp;module"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br /><br />}<br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//**********************&nbsp;init&nbsp;*******************************/<br />//***********************************************************/<br />//inform&nbsp;the&nbsp;kernel&nbsp;where&nbsp;to&nbsp;start&nbsp;and&nbsp;stop&nbsp;with&nbsp;our&nbsp;module/driver<br /></span><span style="color: #0000BB">module_init&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">driver_init</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">module_exit&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">driver_exit</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">MODULE_AUTHOR</span><span style="color: #007700">(</span><span style="color: #DD0000">"A.&nbsp;Markovic"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">MODULE_DESCRIPTION</span><span style="color: #007700">(</span><span style="color: #DD0000">"My&nbsp;first&nbsp;kernel&nbsp;module"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">MODULE_LICENSE</span><span style="color: #007700">(</span><span style="color: #DD0000">"GPL"</span><span style="color: #007700">);&nbsp;<br /></span></code></div></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Makefile</span> (skripta za utomatsko kompajliranje)<br />
<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">obj</span><span style="color: #007700">-</span><span style="color: #0000BB">m&nbsp;</span><span style="color: #007700">:=&nbsp;</span><span style="color: #0000BB">hello</span><span style="color: #007700">.</span><span style="color: #0000BB">o<br /><br /><br />KERNEL_DIR&nbsp;</span><span style="color: #007700">=&nbsp;/</span><span style="color: #0000BB">usr</span><span style="color: #007700">/</span><span style="color: #0000BB">src</span><span style="color: #007700">/</span><span style="color: #0000BB">linux</span><span style="color: #007700">-</span><span style="color: #0000BB">headers</span><span style="color: #007700">-&#36;(</span><span style="color: #0000BB">shell&nbsp;uname&nbsp;</span><span style="color: #007700">-</span><span style="color: #0000BB">r</span><span style="color: #007700">)<br /><br /></span><span style="color: #0000BB">all</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&#36;(</span><span style="color: #0000BB">MAKE</span><span style="color: #007700">)&nbsp;-</span><span style="color: #0000BB">C&nbsp;</span><span style="color: #007700">&#36;(</span><span style="color: #0000BB">KERNEL_DIR</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">SUBDIRS</span><span style="color: #007700">=&#36;(</span><span style="color: #0000BB">PWD</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">modules<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />clean</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">rm&nbsp;</span><span style="color: #007700">-</span><span style="color: #0000BB">rf&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">o&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">ko&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">mod</span><span style="color: #007700">.*&nbsp;*.</span><span style="color: #0000BB">symvers&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">order&nbsp;<br /></span></code></div></div></div><br />
U ovom Makefile vidite da se poziva hederi za trenutni OS na kome radite ali ako tu explicitno navedete neku drugu verziju hedera, recimo specificnu za RPi, moze bez problema da se iskompalira i za druge procesore.<br />
<br />
Koga ovo bude interesovalo neka slobodno postavi pitanja <img src="https://forum.yu3ma.net/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /><br />
<br />
Sve ovo je opisano u odlicnom YT tutorialu (8 delova):<br />
<a href="https://www.youtube.com/watch?v=-O6GsrmOUgY" target="_blank" rel="noopener" class='oembed'>https://www.youtube.com/watch?v=-O6GsrmOUgY</a><br />
<br />
Nakon uspesnog kompajliranja (poziva se "<span style="font-weight: bold;" class="mycode_b">make</span>"), treba da dobijete <span style="font-weight: bold;" class="mycode_b">hello.ko</span> fajl koji predstavlja sam driver.<br />
Drajver se ucitava u kernel sa komandom "<span style="font-weight: bold;" class="mycode_b">insmod hello.ko</span>";<br />
Tokom ucitavanja sam drajver ce ispisati nekoliko poruka i te poruke mogu da se vide u syslog (<span style="font-weight: bold;" class="mycode_b">dmesg</span>);<br />
Iskljucivanje / deaktivacija drajvera se radi komandom "<span style="font-weight: bold;" class="mycode_b">rmmod hello</span>".<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.yu3ma.net/images/attachtypes/txt.gif" title="" border="0" alt=".c" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=15339" target="_blank" title="">hello.c</a> (Size: 5,71 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Ovih dana sam experimentisao malo sa pisanjem Linux kernel modula (device driver) i dostavljam ovde jedan prost primer kao osnovu - skeleton.<br />
<br />
Ovde pokazujem jedan primer za "Character Device" (suprotno od "Block Device") driver, parce dinamickog programa koji se ucitava u kernel i koji operise sa tkz seriskim tipovima uredjaja, npr raznim komunikacioni portovi poput RS232, I2C, USB i slicno. <br />
Primetice te da nije uradjena fizicka komunikacija vec je ceo drajver napravljen kao "fake", tj moze u njega da se upisuje i posle da se iscitavaju podaci, kao da imamo prikacenu neku serisku memoriju od 100 bajtova ("virtual_device").<br />
<br />
Razvojno okruzenje je Linux Debian 8 sa potrebnim paketima (gcc, make, linux-headers …)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">hello.c</span> C++ source code (zanemarite PHP, iskorisceno za forum samo za highligh sintakse)<br />
<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #FF8000">/**********************************************************<br />***********************************************************<br />hello.c<br />***********************************************************<br />***********************************************************/<br /><br />#include&nbsp;&lt;linux/init.h&gt;&nbsp;//MUST<br />#include&nbsp;&lt;linux/module.h&gt;&nbsp;//MUST<br />#include&nbsp;&lt;linux/moduleparam.h&gt;&nbsp;//to&nbsp;pass&nbsp;params<br />#include&nbsp;&lt;linux/fs.h&gt;&nbsp;//File&nbsp;system&nbsp;operations,&nbsp;read/write,&nbsp;open/close&nbsp;device&nbsp;drivers<br />#include&nbsp;&lt;linux/cdev.h&gt;&nbsp;//characher&nbsp;device&nbsp;driver<br />#include&nbsp;&lt;linux/semaphore.h&gt;&nbsp;//used&nbsp;to&nbsp;access&nbsp;semaphores;&nbsp;sunchronization&nbsp;behaviors<br />#include&nbsp;&lt;asm/uaccess.h&gt;&nbsp;//copy_to_user;&nbsp;copy_from_user<br /><br />//other&nbsp;variables<br /></span><span style="color: #0000BB">struct&nbsp;cdev&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//my&nbsp;charachter&nbsp;device<br /></span><span style="color: #0000BB">int&nbsp;major_number</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//will&nbsp;store&nbsp;our&nbsp;major&nbsp;number&nbsp;-&nbsp;extracted&nbsp;from&nbsp;dev_t&nbsp;using&nbsp;macro&nbsp;-&nbsp;mknod&nbsp;/directory/files&nbsp;c&nbsp;major&nbsp;minor<br /></span><span style="color: #0000BB">int&nbsp;ret</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//used&nbsp;to&nbsp;hold&nbsp;return&nbsp;values&nbsp;of&nbsp;functions;&nbsp;this&nbsp;is&nbsp;because&nbsp;kernel&nbsp;stack&nbsp;is&nbsp;very&nbsp;small&nbsp;so&nbsp;declare&nbsp;variables&nbsp;all&nbsp;over&nbsp;the&nbsp;pass&nbsp;in&nbsp;our&nbsp;module&nbsp;functions&nbsp;eats&nbsp;up&nbsp;the&nbsp;stack&nbsp;very&nbsp;fast<br /></span><span style="color: #0000BB">dev_t&nbsp;dev_num</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//&nbsp;hold&nbsp;major&nbsp;naumber&nbsp;that&nbsp;kernel&nbsp;give&nbsp;us;&nbsp;name&nbsp;--&gt;&nbsp;apears&nbsp;in&nbsp;/proc/devices<br /><br />#define&nbsp;DEVICE_NAME&nbsp;"mikidev"<br /><br />//structure&nbsp;for&nbsp;device<br /></span><span style="color: #0000BB">struct&nbsp;fake_device&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">char&nbsp;data</span><span style="color: #007700">[</span><span style="color: #0000BB">100</span><span style="color: #007700">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">struct&nbsp;semaphore&nbsp;sem</span><span style="color: #007700">;<br />}&nbsp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">;<br /><br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//***********************************************************/<br />//***********************************************************/<br /><br />//pass&nbsp;the&nbsp;params&nbsp;(not&nbsp;used&nbsp;now)<br /></span><span style="color: #0000BB">int&nbsp;my_param&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">module_param</span><span style="color: #007700">(</span><span style="color: #0000BB">my_param</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">int</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">S_IRUSR&nbsp;</span><span style="color: #007700">|&nbsp;</span><span style="color: #0000BB">S_IWUSR</span><span style="color: #007700">);<br /><br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//**********************&nbsp;device&nbsp;operation&nbsp; ******************/<br />//***********************************************************/<br /><br />//called&nbsp;on&nbsp;device_file&nbsp;open<br />//inode&nbsp;reference&nbsp;to&nbsp;the&nbsp;file&nbsp;on&nbsp;disk<br />//and&nbsp;contains&nbsp;information&nbsp;about&nbsp;the&nbsp;file<br />//struct&nbsp;files&nbsp;is&nbsp;represents&nbsp;an&nbsp;abstract&nbsp;open&nbsp;file<br /></span><span style="color: #0000BB">int&nbsp;device_open&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;inode&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">inode</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">struct&nbsp;file&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">filp</span><span style="color: #007700">)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//only&nbsp;allow&nbsp;one&nbsp;process&nbsp;to&nbsp;open&nbsp;this&nbsp;device&nbsp;by&nbsp;using&nbsp;semaphore&nbsp;as&nbsp;mutual&nbsp;exclusive&nbsp;lock&nbsp;-&nbsp;mutex<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">down_interruptible</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">sem</span><span style="color: #007700">)&nbsp;!=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;could&nbsp;not&nbsp;lock&nbsp;device&nbsp;during&nbsp;open"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"mikidev:&nbsp;opened&nbsp;device"</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />}<br /><br /></span><span style="color: #0000BB">ssize_t&nbsp;device_read&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;file</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">filp</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">char</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">bufStoreData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">size_t&nbsp;bufCount</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">loff_t</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">curOffset</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//take&nbsp;the&nbsp;kernel&nbsp;space&nbsp;(device)&nbsp;to&nbsp;user&nbsp;space&nbsp;(process)<br />&nbsp;&nbsp;&nbsp;&nbsp;//copy_to_user&nbsp;(destiantion,&nbsp;source,&nbsp;sizeToTransfer)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;Reading&nbsp;from&nbsp;device"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">copy_to_user</span><span style="color: #007700">(</span><span style="color: #0000BB">bufStoreData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bufCount</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">ssize_t&nbsp;device_write&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;file</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">filp</span><span style="color: #007700">,&nbsp;const&nbsp;</span><span style="color: #0000BB">char</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">bufSourceData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">size_t&nbsp;bufCount</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">loff_t</span><span style="color: #007700">*&nbsp;</span><span style="color: #0000BB">curOffset</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//send&nbsp;data&nbsp;from&nbsp;user&nbsp;to&nbsp;kernel<br />&nbsp;&nbsp;&nbsp;&nbsp;//copy_from_user&nbsp;(destiantion,&nbsp;source,&nbsp;sizeToTransfer)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;Writng&nbsp;to&nbsp;device"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">copy_from_user</span><span style="color: #007700">(</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">data</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bufSourceData</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">bufCount</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">int&nbsp;device_close</span><span style="color: #007700">(</span><span style="color: #0000BB">struct&nbsp;inode&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">inode</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">struct&nbsp;file&nbsp;</span><span style="color: #007700">*</span><span style="color: #0000BB">filp</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//by&nbsp;calling&nbsp;up,&nbsp;whic&nbsp;is&nbsp;opposite&nbsp;of&nbsp;down&nbsp;for&nbsp;semaphore,&nbsp;we&nbsp;realease&nbsp;the&nbsp;mutex&nbsp;we&nbsp;obtained&nbsp;ad&nbsp;device&nbsp;open<br />&nbsp;&nbsp;&nbsp;&nbsp;//this&nbsp;has&nbsp;the&nbsp;effect&nbsp;of&nbsp;allowing&nbsp;other&nbsp;process&nbsp;to&nbsp;use&nbsp;the&nbsp;device&nbsp;now<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">up</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">sem</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;closed&nbsp;device"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">//tell&nbsp;the&nbsp;kernel&nbsp;which&nbsp;functions&nbsp;to&nbsp;call&nbsp;when&nbsp;user&nbsp;operates&nbsp;on&nbsp;our&nbsp;device&nbsp;file<br /></span><span style="color: #0000BB">struct&nbsp;file_operations&nbsp;fops&nbsp;</span><span style="color: #007700">=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000BB">owner&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">THIS_MODULE</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//prevent&nbsp;unloading&nbsp;of&nbsp;this&nbsp;module&nbsp;when&nbsp;operations&nbsp;are&nbsp;in&nbsp;use<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">open&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_open</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;opening&nbsp;the&nbsp;device<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">release&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_close</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;closing&nbsp;the&nbsp;device<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">write&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_write</span><span style="color: #007700">,&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;writing&nbsp;the&nbsp;device<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">.</span><span style="color: #0000BB">read&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">device_read&nbsp;</span><span style="color: #FF8000">//points&nbsp;to&nbsp;method&nbsp;to&nbsp;call&nbsp;when&nbsp;reading&nbsp;the&nbsp;device<br /></span><span style="color: #007700">};<br /><br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//**********************&nbsp;module&nbsp;operation&nbsp;*******************/<br />//***********************************************************/<br /></span><span style="color: #007700">static&nbsp;</span><span style="color: #0000BB">int&nbsp;driver_init&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">void</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//register&nbsp;our&nbsp;device&nbsp;with&nbsp;the&nbsp;system:&nbsp;a&nbsp;two&nbsp;step&nbsp;process<br />&nbsp;&nbsp;&nbsp;&nbsp;//step&nbsp;1&nbsp;use&nbsp;dynamic&nbsp;alloacation&nbsp;to&nbsp;assign&nbsp;our&nbsp;device&nbsp;a&nbsp;major&nbsp;number&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;--&nbsp;alloc_chrdev_region&nbsp;(dev_t*,&nbsp;uint&nbsp;fminor,&nbsp;uint&nbsp;count,&nbsp;char*&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">alloc_chrdev_region&nbsp;</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">,</span><span style="color: #0000BB">1</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">&lt;&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{</span><span style="color: #FF8000">//alert&nbsp;time&nbsp;kernel&nbsp;functions&nbsp;return&nbsp;negatives,&nbsp;there&nbsp;is&nbsp;an&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;faild&nbsp;to&nbsp;allocate&nbsp;a&nbsp;major&nbsp;number"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//propagate&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">major_number&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">MAJOR</span><span style="color: #007700">(</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//extract&nbsp;the&nbsp;major&nbsp;number&nbsp;and&nbsp;store&nbsp;into&nbsp;our&nbsp;variables&nbsp;(MACRO)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;major&nbsp;number&nbsp;is&nbsp;%d"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">major_number</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_INFO&nbsp;</span><span style="color: #DD0000">"&#092;tuse&nbsp;&#092;"mknod&nbsp;/dev/%s&nbsp;c&nbsp;%d&nbsp;0&#092;"&nbsp;for&nbsp;device&nbsp;file"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">major_number</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//dmesg<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mcdev&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cdev_alloc</span><span style="color: #007700">();&nbsp;</span><span style="color: #FF8000">//create&nbsp;our&nbsp;cdev&nbsp;structure,&nbsp;initialize&nbsp;our&nbsp;cdev<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ops&nbsp;</span><span style="color: #007700">=&nbsp;&amp;</span><span style="color: #0000BB">fops</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//struct&nbsp;file_operations<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">owner&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">THIS_MODULE</span><span style="color: #007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//now&nbsp;we&nbsp;created&nbsp;cdev,&nbsp;we&nbsp;have&nbsp;to&nbsp;add&nbsp;it&nbsp;to&nbsp;the&nbsp;kernel<br />&nbsp;&nbsp;&nbsp;&nbsp;//int&nbsp;cdev_add(struct&nbsp;cdev*&nbsp;dev,&nbsp;dev_t&nbsp;num,&nbsp;unsigned&nbsp;int&nbsp;count)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">cdev_add</span><span style="color: #007700">(</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(</span><span style="color: #0000BB">ret&nbsp;</span><span style="color: #007700">&lt;&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">)&nbsp;{&nbsp;</span><span style="color: #FF8000">//always&nbsp;check&nbsp;errors<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;unable&nbsp;to&nbsp;add&nbsp;cdev&nbsp;to&nbsp;kernel"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">ret</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//initialise&nbsp;our&nbsp;semaphore<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">sema_init&nbsp;</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">virtual_device</span><span style="color: #007700">.</span><span style="color: #0000BB">sem</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//initial&nbsp;values&nbsp;of&nbsp;one<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">return&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br /><br />static&nbsp;</span><span style="color: #0000BB">void&nbsp;driver_exit&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">void</span><span style="color: #007700">)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//unregister&nbsp;evrything&nbsp;in&nbsp;reverse&nbsp;order<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">cdev_del</span><span style="color: #007700">(</span><span style="color: #0000BB">mcdev</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">unregister_chrdev_region</span><span style="color: #007700">(</span><span style="color: #0000BB">dev_num</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">printk</span><span style="color: #007700">(</span><span style="color: #0000BB">KERN_ALERT&nbsp;</span><span style="color: #DD0000">"%s:&nbsp;unloaded&nbsp;module"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">DEVICE_NAME</span><span style="color: #007700">);<br /><br />}<br /><br /></span><span style="color: #FF8000">//***********************************************************/<br />//**********************&nbsp;init&nbsp;*******************************/<br />//***********************************************************/<br />//inform&nbsp;the&nbsp;kernel&nbsp;where&nbsp;to&nbsp;start&nbsp;and&nbsp;stop&nbsp;with&nbsp;our&nbsp;module/driver<br /></span><span style="color: #0000BB">module_init&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">driver_init</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">module_exit&nbsp;</span><span style="color: #007700">(</span><span style="color: #0000BB">driver_exit</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">MODULE_AUTHOR</span><span style="color: #007700">(</span><span style="color: #DD0000">"A.&nbsp;Markovic"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">MODULE_DESCRIPTION</span><span style="color: #007700">(</span><span style="color: #DD0000">"My&nbsp;first&nbsp;kernel&nbsp;module"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">MODULE_LICENSE</span><span style="color: #007700">(</span><span style="color: #DD0000">"GPL"</span><span style="color: #007700">);&nbsp;<br /></span></code></div></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Makefile</span> (skripta za utomatsko kompajliranje)<br />
<br />
<div class="codeblock phpcodeblock"><div class="title">PHP Code:</div><div class="body"><div dir="ltr"><code><span style="color: #0000BB">obj</span><span style="color: #007700">-</span><span style="color: #0000BB">m&nbsp;</span><span style="color: #007700">:=&nbsp;</span><span style="color: #0000BB">hello</span><span style="color: #007700">.</span><span style="color: #0000BB">o<br /><br /><br />KERNEL_DIR&nbsp;</span><span style="color: #007700">=&nbsp;/</span><span style="color: #0000BB">usr</span><span style="color: #007700">/</span><span style="color: #0000BB">src</span><span style="color: #007700">/</span><span style="color: #0000BB">linux</span><span style="color: #007700">-</span><span style="color: #0000BB">headers</span><span style="color: #007700">-&#36;(</span><span style="color: #0000BB">shell&nbsp;uname&nbsp;</span><span style="color: #007700">-</span><span style="color: #0000BB">r</span><span style="color: #007700">)<br /><br /></span><span style="color: #0000BB">all</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&#36;(</span><span style="color: #0000BB">MAKE</span><span style="color: #007700">)&nbsp;-</span><span style="color: #0000BB">C&nbsp;</span><span style="color: #007700">&#36;(</span><span style="color: #0000BB">KERNEL_DIR</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">SUBDIRS</span><span style="color: #007700">=&#36;(</span><span style="color: #0000BB">PWD</span><span style="color: #007700">)&nbsp;</span><span style="color: #0000BB">modules<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />clean</span><span style="color: #007700">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">rm&nbsp;</span><span style="color: #007700">-</span><span style="color: #0000BB">rf&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">o&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">ko&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">mod</span><span style="color: #007700">.*&nbsp;*.</span><span style="color: #0000BB">symvers&nbsp;</span><span style="color: #007700">*.</span><span style="color: #0000BB">order&nbsp;<br /></span></code></div></div></div><br />
U ovom Makefile vidite da se poziva hederi za trenutni OS na kome radite ali ako tu explicitno navedete neku drugu verziju hedera, recimo specificnu za RPi, moze bez problema da se iskompalira i za druge procesore.<br />
<br />
Koga ovo bude interesovalo neka slobodno postavi pitanja <img src="https://forum.yu3ma.net/images/smilies/smile.gif" alt="Smile" title="Smile" class="smilie smilie_1" /><br />
<br />
Sve ovo je opisano u odlicnom YT tutorialu (8 delova):<br />
<a href="https://www.youtube.com/watch?v=-O6GsrmOUgY" target="_blank" rel="noopener" class='oembed'>https://www.youtube.com/watch?v=-O6GsrmOUgY</a><br />
<br />
Nakon uspesnog kompajliranja (poziva se "<span style="font-weight: bold;" class="mycode_b">make</span>"), treba da dobijete <span style="font-weight: bold;" class="mycode_b">hello.ko</span> fajl koji predstavlja sam driver.<br />
Drajver se ucitava u kernel sa komandom "<span style="font-weight: bold;" class="mycode_b">insmod hello.ko</span>";<br />
Tokom ucitavanja sam drajver ce ispisati nekoliko poruka i te poruke mogu da se vide u syslog (<span style="font-weight: bold;" class="mycode_b">dmesg</span>);<br />
Iskljucivanje / deaktivacija drajvera se radi komandom "<span style="font-weight: bold;" class="mycode_b">rmmod hello</span>".<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.yu3ma.net/images/attachtypes/txt.gif" title="" border="0" alt=".c" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=15339" target="_blank" title="">hello.c</a> (Size: 5,71 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>