Teaching materials
Grading rubric
Labs 1 to 8 are 5% of the grade each, judged on three parts: it works (50% of the lab), measurements and analysis (30%) and write-up (20%). The weights are the assessment table's; this page says what full, partial and no credit mean for each part, lab by lab. Labs 9 and 10 are graded as the final project's checkpoint and demo. In the semester, a topic's second lab uses that topic's rubric.
In every lab
Students work in pairs, and each student hands in their own report: what they did, what they measured, and one problem they met and how they solved it. The write-up part judges that report in every lab.
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| Write-up (20%) | Says what was done in order, gives every measurement with its unit, and describes one real problem, its cause and its fix | One of the three is missing or vague, or the problem is named without its cause or fix | No report, or a report that only lists the hand-ins |
A board that will not boot is never a reason to lose marks: recovering one is a skill the course teaches. Grade a pair that lost time to a recovery on what they recovered and recorded.
Lab 1: First boot
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | The board boots from a written image; the student logs in over serial and over SSH | Boots and logs in over one of serial or SSH only | No boot, or no login |
| Measurements and analysis (30%) | The image's SHA-256 matches the published value and its source is named; the raw log starts at power-on and runs to the login prompt | Checksum given but not compared, or the log is missing its first lines | No checksum, or no raw log |
Lab 2: Board anatomy and power rails
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | Every major part labelled on the photo; every rail measured; current recorded at idle and under load | Some parts or rails missing, or current at one condition only | No photo, or no rail measured |
| Measurements and analysis (30%) | Rail table with name, nominal, measured and feeding regulator; current chart with its axis from zero and units on the axis titles; a correct paragraph on why rails come up in sequence before reset | Table or chart incomplete, chart axis not from zero, or the sequence paragraph is missing or wrong | No rail table and no chart |
Lab 3: Boot ROM and the SRAM stage
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | Board started over USB; the student's own first-stage build, with an added console line, boots over USB | Started over USB with the published first stage, but the student's own build did not run | Never started over USB |
| Measurements and analysis (30%) | Boot order recorded for each switch position; the boot ROM's and first stage's lines marked correctly; a correct paragraph on what the first stage must do | Boot order for one position only, or lines marked with errors | No boot order and no annotation |
Lab 4: Memory and the bootloader
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | A changed memory clock built and started over USB; a kernel booted by hand from the U-Boot prompt to a login | One of the two done, or the hand boot reached the kernel but not a login | Neither |
| Measurements and analysis (30%) | Memory size and clock before and after the change, and its effect explained; the exact commands that booted the kernel; a memory map with each image's address | Effect recorded but not explained, commands incomplete, or the map is missing images | No memory change recorded and no commands |
Lab 5: UEFI and Linux boot
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | A stock generic distribution boots through UEFI; the student's systemd service starts at boot | One of the two | Neither |
| Measurements and analysis (30%) | Every line of the boot log has its stage named; a boot-time breakdown with the slowest services | Log mostly annotated with stages missing, or a breakdown without the slowest services | No annotated log and no breakdown |
Lab 6: Device tree and GPIO
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | The student's overlay binds the kernel's DS3231 driver and a second /dev/rtc appears; the LED blinks and the button is read with libgpiod; the motor switches through the MOSFET with the flyback diode fitted the right way | One or two of the three work | None of the three |
| Measurements and analysis (30%) | Before-and-after /sys and /dev listings; the LED's resistor calculated and its current measured; why the pin cannot run the motor and what the diode does; a latency histogram for idle and for load; a paragraph explaining from the histogram why Linux is not hard real time | Histogram for one case only, or the paragraph does not use the measurement | No listings and no histogram |
Lab 7: I2C and SPI
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | The DS3231's time read by hand from its registers; the time shown on the OLED; both ADC inputs read over SPI | Some of the three | None of the parts answers |
| Measurements and analysis (30%) | Decoded I2C and SPI captures that match what the program sent; a sensor reading calibrated to its unit, with the method | One capture only, or an uncalibrated reading | No captures |
Lab 8: UART and a driver
| Part | Full credit | Partial credit | No credit |
|---|---|---|---|
| It works (50%) | Messages exchanged at two baud rates; the userspace library and tool read the ADC and its tests pass against the mocked bus | UART or driver works but not both, or the tests do not run | Neither |
| Measurements and analysis (30%) | A capture at mismatched baud rates with its framing errors explained; the library's reading compared with the kernel driver's, and when each is the right choice | Capture without the explanation, or no comparison with the kernel driver | No capture and no comparison |
The kernel module is a stretch goal in the quarter: credit it within these parts, never require it. In the semester it is required, and judged under it works: the module loads, its character device reports the counter, and it unloads cleanly, with its dmesg lines handed in. Lab 8 handout.
Practical midterm
Individually, at a station, after lab 6; 15% of the grade in the assessment table. Each task is a third of the midterm. Allowed references: the parts' datasheets, man pages and --help output on the board and the bench PC, and the printed 40-pin header map.
| Task | Full credit | Partial credit | No credit |
|---|---|---|---|
| Boot the board | Boots to a login over the serial console, wired correctly with the board unplugged | Boots with help from the examiner | Does not boot |
| Enable a header bus | The named overlay is found, applied and checked in /dev or /sys | Applied but not checked, or the wrong overlay first | Not applied |
| Drive a GPIO circuit | The given circuit is wired from the pinout and driven or read with libgpiod | Wired but driven only with help | Not working |
Labs 9 and 10: the final project
Labs 9 and 10 carry no lab weight. They are the final project's checkpoint and demo, weighted with its proposal and its report and repository in the assessment table. Each student answers demo questions alone.
| Component | Full credit | Partial credit | No credit |
|---|---|---|---|
| Proposal (with lab 6) | One page naming what will be built, the two or more buses it uses and its parts list | One of the three missing or too vague to build from | Not handed in |
| Checkpoint (lab 9) | One subsystem works end to end; the design document is updated; the recovery runbook brings a broken boot back when another student follows it | A subsystem partly working, or a runbook with steps missing | Nothing working and no runbook |
| Demo (lab 10) | Starts from power-on with nothing typed, uses at least two of the course's buses, comes back after its power is pulled, and each student answers questions on it | Meets some of the requirements, or needs help to start | Does not run |
| Report and repository | A README another student could rebuild the project from, and a report on its design and what was measured | README or report incomplete | Neither handed in |