This shows you the differences between two versions of the page.
|
so2:laboratoare:lab12:exercitii [2018/05/16 11:11] rares.visalom [3. [2p] Adăugare atribute del și add] |
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. | ||
| + | O implementare pentru funcția de afișare de type este | ||
| + | |||
| + | <code c> | ||
| + | static ssize_t | ||
| + | type_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
| + | { | ||
| + | struct bex_device *bex_dev = to_bex_device(dev); | ||
| + | |||
| + | return sprintf(buf, "%s\n", bex_dev->type); | ||
| + | } | ||
| + | DEVICE_ATTR_RO(type); | ||
| + | </code> | ||
| ==== 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 159: | 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> | ||