Ten eerste: wat wil ik:
Ik heb bij meneer Bart Smit een leuk digitaal fotolijstje annex sleutelhanger gehaald. 128x128 pixels, maar liefst twee hele megabytes aan RAM, een processor van 2 decennia geleden... ach, voor een tientje mag ik niet klagen
De software is, as always, een Windows-hotsie-flotsie-dingetje. Ik wil het ding eigenlijk compleet zelf aansturen, en om dat te kunnen doen heb ik als eerste eigen software daarvoor nodig. Omdat mijn main platform eigenlijk Linux is, gaat stap 1 een Linux lees-en-schrijf-progsel zijn.
Ik heb dus zitten uitvogelen hoe het onder Windows werkt. Nou, het blijkt dat het device zich als een standaard mass-storage-device voordoet. Dat is het echter absoluut niet: writes en reads naar bepaalde schijflocaties worden gebruikt als 'triggers' om bepaalde operaties te doen.
Mijn probleem met het nadoen van de software onder Linux is nu dat Linux ervanuitgaat dat data op schijven alleen verandert als het OS erheenschrijft, en dat als ik byte N inlees, het vast geen kwaad kan om de eropvolgende 4K-1 bytes ook in te lezen. Bij normale schijven is dat compleet wenselijk, maar bij dit device raak je dan allerlei triggers en haal je bij het lezen verouderde info uit de cache.
Mijn vraag is dus: Hoe instrueer ik Linux om alleen die bytes te lezen en te schrijven die ik wil? Als ik /dev/sdx open, buffert 'ie er vrolijk op los. O_DIRECT heb ik al geprobeerd, maar dan gaat om de een of andere vage manier mijn lseek niet meer goed; bovendien heb ik gelezen dat je dan aan vage boundaries van 4K zit, wat ik al helemaal niet kan gebruiken. Ik heb wel iets gelezen over een raw device driver in de kernel, maar naast dat ik niet zou weten of dat werkt, heb ik liever niet dat ik m'n kernel moet recompilen. (Niet dat ik dat niet kan, maar als ik mijn progje later ga uitgeven moet iedereen die raw device support hebben.) Zou ik misschien direct tegen de SCSI-layer aan kunnen kletsen? Worstcase-scenario kan ik waarschijnlijk altijd libusb gebruiken, maar dan moet ik een manier vinden om de kernel te vertellen dat 'ie met z'n klauwen van mijn mass storage device af moet blijven.
Ik heb bij meneer Bart Smit een leuk digitaal fotolijstje annex sleutelhanger gehaald. 128x128 pixels, maar liefst twee hele megabytes aan RAM, een processor van 2 decennia geleden... ach, voor een tientje mag ik niet klagen
Ik heb dus zitten uitvogelen hoe het onder Windows werkt. Nou, het blijkt dat het device zich als een standaard mass-storage-device voordoet. Dat is het echter absoluut niet: writes en reads naar bepaalde schijflocaties worden gebruikt als 'triggers' om bepaalde operaties te doen.
Mijn probleem met het nadoen van de software onder Linux is nu dat Linux ervanuitgaat dat data op schijven alleen verandert als het OS erheenschrijft, en dat als ik byte N inlees, het vast geen kwaad kan om de eropvolgende 4K-1 bytes ook in te lezen. Bij normale schijven is dat compleet wenselijk, maar bij dit device raak je dan allerlei triggers en haal je bij het lezen verouderde info uit de cache.
Mijn vraag is dus: Hoe instrueer ik Linux om alleen die bytes te lezen en te schrijven die ik wil? Als ik /dev/sdx open, buffert 'ie er vrolijk op los. O_DIRECT heb ik al geprobeerd, maar dan gaat om de een of andere vage manier mijn lseek niet meer goed; bovendien heb ik gelezen dat je dan aan vage boundaries van 4K zit, wat ik al helemaal niet kan gebruiken. Ik heb wel iets gelezen over een raw device driver in de kernel, maar naast dat ik niet zou weten of dat werkt, heb ik liever niet dat ik m'n kernel moet recompilen. (Niet dat ik dat niet kan, maar als ik mijn progje later ga uitgeven moet iedereen die raw device support hebben.) Zou ik misschien direct tegen de SCSI-layer aan kunnen kletsen? Worstcase-scenario kan ik waarschijnlijk altijd libusb gebruiken, maar dan moet ik een manier vinden om de kernel te vertellen dat 'ie met z'n klauwen van mijn mass storage device af moet blijven.
Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog