This shows you the differences between two versions of the page.
so2:laboratoare:lab12:exercitii [2018/05/16 13:07] razvan.deaconescu [2. [2p] Adăugare atribute pentru tip și versiune] |
so2:laboratoare:lab12:exercitii [2019/05/20 14:32] (current) razvan.deaconescu [1. [2p] Implementare bus] |
||
---|---|---|---|
Line 103: | Line 103: | ||
===== Completare formular de feedback ===== | ===== Completare formular de feedback ===== | ||
- | Apreciem opinia voastră legată de activitățile cursului de SO2. Ne ajută să îmbunătățim cursul și să facem materia cât mai accesibilă și interesantă. Pentru această vă rugăm să completați [[http://cs.curs.pub.ro/2017/blocks/feedbackacs/stats.php?courseid=144&blockid=2391|formularul de feedback de pe cs.curs.pub.ro]] (trebuie să fiți autentificați și înrolați în cadrul cursului). Vă mulțumim! | + | Apreciem opinia voastră legată de activitățile cursului de SO2. Ne ajută să îmbunătățim cursul și să facem materia cât mai accesibilă și interesantă. Pentru această vă rugăm să completați [[https://acs.curs.pub.ro/2018/course/view.php?id=295|formularul de feedback de pe cs.curs.pub.ro]] (trebuie să fiți autentificați și înrolați în cadrul cursului). Vă mulțumim! |
==== 1. [2p] Implementare bus ==== | ==== 1. [2p] Implementare bus ==== | ||
+ | |||
Analizați conținutul fișierului ''bex.c'', care conține implementarea unui driver de magistrală. Urmăriți comentariile marcate cu ''TODO 1'' pentru a implementa părțile ce lipsesc: înregistrați driverul de magistrală și adăugați un nou device, numit ''root'', cu tipul ''none'' și versiunea ''1''. | Analizați conținutul fișierului ''bex.c'', care conține implementarea unui driver de magistrală. Urmăriți comentariile marcate cu ''TODO 1'' pentru a implementa părțile ce lipsesc: înregistrați driverul de magistrală și adăugați un nou device, numit ''root'', cu tipul ''none'' și versiunea ''1''. | ||
<note tip> | <note tip> | ||
Aruncați o privire pe implementarea funcției ''bex_add_dev()''. | Aruncați o privire pe implementarea funcției ''bex_add_dev()''. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Înregistrarea și deînregistrarea o faceți folosind respectiv funcțiile ''bus_register()'' și ''bus_unregister()''. | ||
</note> | </note> | ||
Line 119: | Line 124: | ||
Adăugați două atribute read-only: ''type'' și ''version''. Urmăriți comentariile marcate cu ''TODO 2''. | Adăugați două atribute read-only: ''type'' și ''version''. Urmăriți comentariile marcate cu ''TODO 2''. | ||
+ | |||
+ | <note tip> | ||
+ | Va trebui să adăugați cele două atribute ''type'' și ''version'' în structura ''bex_dev_attrs'' pe modelul: | ||
+ | <code> | ||
+ | &dev_attr_<insert-attribute-type-here>.attr, | ||
+ | </code> | ||
+ | </note> | ||
Observați că cele două atribute noi sunt vizibile în ''/sys/bus/bex/devices/root''. Verificați conținutul acestor atribute. | Observați că cele două atribute noi sunt vizibile în ''/sys/bus/bex/devices/root''. Verificați conținutul acestor atribute. | ||
Line 136: | Line 148: | ||
==== 3. [2p] Adăugare atribute del și add ==== | ==== 3. [2p] Adăugare atribute del și add ==== | ||
- | Adăugați două atribute write-only, numite ''del'' și ''add''. | + | Adăugați două atribute write-only, numite ''del'' și ''add''. ''del'' așteaptă un nume de device pentru a îl elimina, iar ''add'' așteaptă numele, tipul și versiunea pentru a crea un device nou. Urmăriți comentariile marcate cu ''TODO 3''. |
- | ''del'' așteaptă un nume de device pentru a îl elimina, iar ''add'' așteaptă numele, tipul și versiunea pentru a crea un device noi. Urmăriți comentariile marcate cu ''TODO 3''. | + | |
+ | <note tip> | ||
+ | Va trebui să adăugați atributele ''del'' și ''add'' în structura ''bex_bus_attr'' pe modelul: | ||
+ | <code> | ||
+ | &bus_attr_<insert-attribute-name-here>.attr, | ||
+ | </code> | ||
+ | |||
+ | </note> | ||
<note tip> | <note tip> | ||
Folosiți ''sscanf'' pentru a parsa inputul de la ''sysfs'' și ''bex_del_dev()'' and ''bex_add_dev()'' pentru a șterge și crea un device nou. | Folosiți ''sscanf'' pentru a parsa inputul de la ''sysfs'' și ''bex_del_dev()'' and ''bex_add_dev()'' pentru a șterge și crea un device nou. | ||
</note> | </note> | ||
+ | |||
+ | Un exemplu de funcție de tipul ''store'' este: | ||
+ | |||
+ | <code c> | ||
+ | static ssize_t | ||
+ | add_store(struct bus_type *bt, const char *buf, size_t count) | ||
+ | { | ||
+ | char type[32], name[32]; | ||
+ | int version; | ||
+ | int ret; | ||
+ | |||
+ | ret = sscanf(buf, "%31s %31s %d", name, type, &version); | ||
+ | if (ret != 3) | ||
+ | return -EINVAL; | ||
+ | |||
+ | return bex_add_dev(name, type, version) ? : count; | ||
+ | } | ||
+ | BUS_ATTR(add, S_IWUSR, NULL, add_store); | ||
+ | </code> | ||
Creați un device nou și verificați dacă este vizibil în ''/sys/bus/bex/devices''. Eliminați-l și verificați că a dispărut din ''sysfs''. | Creați un device nou și verificați dacă este vizibil în ''/sys/bus/bex/devices''. Eliminați-l și verificați că a dispărut din ''sysfs''. | ||
Line 171: | Line 209: | ||
==== 5. [1.5p] Înregistrarea unui device bex misc în funcția probe ==== | ==== 5. [1.5p] Înregistrarea unui device bex misc în funcția probe ==== | ||
- | Modificați ''bex.c'' astfel încât operația ''probe'' să eșueze dacă ''version > 1''. Înregistrați device-ul misc în funcția ''bex_misc_probe'' și deînregistrați-l în ''bex_misc_remove''. Urmăriți comentariile marcate cu ''TODO 6''. | + | Modificați ''bex_misc.c'' astfel încât operația ''probe'' să eșueze dacă ''version > 1''. Înregistrați device-ul misc în funcția ''bex_misc_probe()'' și deînregistrați-l în ''bex_misc_remove''. Urmăriți comentariile marcate cu ''TODO 6''. |
<note tip> | <note tip> |