You are on page 1of 17

Question Writer Quiz Print Version

HAL - Eksamen E2014


Studienummer:

I tilfælde af alvorlige problemer med IT udstyr (herunder upload af testresultat)


udfyldes en papirudgave som udleveres af eksamensvagter

Det er en god idé at have en backup af klartekst/kode lokalt på din computer, for
det tilfælde at QuestionWriter skulle gå ned el. lignende.

Kommunikation af nogen art, incl dropbox, facebook, twi)er o.a. er naturligvis


ikke tilladt. Sørg derfor for at have standset sådanne tjenester under eksamen.

Testen påbegyndes når du trykker på ʺnextʺ knappen

Held og lykke!

Question 1 of 16

Med hvilken af nedenstående kommandoer kan man se devices nodes


tilgængelige på et Linux system?

systemctl list-units
lsmod
ls -l /dev
cat /proc/msg

(5 points) | ___

1 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 2 of 16

Hvor må man anvende ʺnew()ʺ til opre)else af dynamisk memory?

User Space
Kernel + User Space
Må ikke bruges
Kernel Space

(5 points) | ___

Question 3 of 16

Hvad fortæller det om driver & devices når der i /dev folderen findes fire filer med
ens major nummer, men forskellige minor numre?

1 driver og 4 devices
ukendt antal drivers og 4 devices
4 drivers og 1 device
1 driver og et ukendt antal devices

(5 points) | ___

2 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 4 of 16

Hvilken virtuel fil under /proc kan være ny)ing til probing af interrupt linjer, hvor
der endnu ikke er installeret en interrupt handler, dvs request_irq() endnu ikke er
kaldt?

/proc/source
/proc/stat
/proc/interrupt
/proc/device

(5 points) | ___

Question 5 of 16

Hvordan ;erner du en driver fra Linux kernen?

modprobe
rmmod
lsmod
rm

(5 points) | ___

3 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 6 of 16

En døra=ryderkontakt er forbundet til en GPIO linje på Devkit8000. Når døren


åbnes skal en interrupt service rutine aktiveres én gang for at besked en til
motorstyringen. Hvordan skal request_irq() kaldet se ud?

request_irq(my_irq, my_isr, IQRF_SHARED, ʺmy_isrʺ, NULL)


request_irq(my_irq, my_isr, IQRF_TRIGGER_HIGH, ʺmy_isrʺ, NULL)
request_irq(my_irq, my_isr, IQRF_TRIGGER_RISING, ʺmy_isrʺ, NULL)
request_irq(my_irq, my_isr, IQRF_TRIGGER_LOW, ʺmy_isrʺ, NULL)

(5 points) | ___

4 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 7 of 16

Fops read() metoden:

ssize_t my_chrdrv_read(struct file *filep, char __user *buf, size_t count, loff_t *f_pos)
{
char readBuf[] = "ABCD";
copy_to_user(buf, readBuf, len);
...}
Kaldes med parameteren count=2. Hvad skal størrelsen af ʺlenʺ sæ)es til?

4
5
2
3

(5 points) | ___

Question 8 of 16

I henhold til Linuxʹ Device model så er følgende drivere, fundet i Linuxʹ source
tree, at betegne som: (match par)

1. i2c-algo-bit.c A. Device Driver


2. i2c-gpio.c B. Adapter Driver
3. rtc-ds1307.c C. Algorithm Driver
1. 2. 3.

(5 points) | ___

5 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 9 of 16

Hviken ʺclock modeʺ og ʺbits_per_wordʺ anvender den viste SPI enhed? (Du skal
sæ)e to krydser)

CPOL = 1 ; CPHA = 1
CPOL = 0 ; CPHA = 1
CPOL = 0 ; CPHA = 0
CPOL = 1 ; CPHA = 0

(6 points) | ___

Question 10 of 16

I forbindelse med en devkit8000 driver ønskes en forsinkelse på 80 us. Hvorledes


implementeres de)e bedst, når det skal være mest præcist?

add_timer()
wait_event_timeout()
usleep()
udelay()

(5 points) | ___

6 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 11 of 16

For at angive at dit system har et givent SPI device, skal du udfylde en
spi_board_info struct. Hvor finder du den relavante information? (match par)

1. mode A. Device Driver


2. chip_select B. Schematic Diagram
3. modalias C. Data sheet
1. 2. 3.

(5 points) | ___

Question 12 of 16

En SPI driverʹs init() metode skal implementeres. Angiv den korrekte rækkefølge
af funktionerne:

A. register_chrdev_region()
B. cdev_init()
C. cdev_add()
D. spi_register_driver()
1.
2.
3.
4.
(5 points) | ___

7 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 13 of 16

I en ADC driver som anvender SysFS interfacet skal a)ribu)en ʺgainʺ som bruger
metoden ʺadc_gain_store()ʺ tilføjes som en default a)ribute. A)ribu)en skal
derfor indsæ)es i device_a)tribute structʹen nedenfor:
static struct device_attribute adc_class_attrs[] = {
(din attribute angivelse),
__ATTR_NULL,
};
Det er din opgave at skrive den manglende a)ibute deklaration, ex
__ATTR(..indhold...) i feltet nedenfor

Type your answer:

(5 points) | ___

8 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 14 of 16

Forklar i klartekst hvordan data overføres fra en user space applikation til en
device driver. Du skal herunder forklare hvilke funktioner som anvendes i hhv.
user space applikationen og kernel space driveren, samt hvorfor.

(9 points) | ___

9 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

Question 15 of 16

Du skal i denne opgave implementere en drivers init() og read() funktioner.


Driveren er del af et EKG analysator system for hvilket følgende gælder:

A/D konverteren sampler ved 200 Hz og generer en puls som interrupter på


Devkit8000ʹs gpio(100) for hver sample.

User Space Applikationen kan kun læse med en hyppighed på 8-10 Hz, hvorfor et
mellemlager i form af en FIFO er nødvendig i driveren. En læsning fra user space
består typisk af flere samples, således at FIFOʹen ikke overflowʹer.

Systemet stiller ud over de almindelige gpio, interrupt mm APIʹer som kendt fra
Devkit8000 også følgende APIʹer til rådighed:

10 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

// adc.h
// Functions are non-blocking
typedef struct adc adc; // Declaration of struct - content not important here
/*
adc_init(): No return value
*/
void adc_init(adc *cthis);

/*
adc_get_value(): Returns 0 on success
@param value Value read from A/D Converter
*/
int adc_get_value(adc *cthis, unsigned char *value);

// fifo.h
// Functions are non-blocking
typedef struct fifo fifo; // Declaration of struct - content not important here
/*
fifo_init(): No return value
@param fifo_size Depth of FIFO
*/
void fifo_init(fifo *cthis, unsigned int fifo_size);

/*
fifo_put(): Returns number of bytes written to the FIFO
@param value Data to be stored in the FIFO
@param length Number of bytes desired to be stored
*/
int fifo_put(fifo *cthis, unsigned char *value, unsigned int length);

/*
fifo_get(): Returns number of bytes read from the FIFO
@param value Data read from the FIFO
@param length Number of bytes desired to be read
*/
int fifo_get(fifo *cthis, unsigned char *value, unsigned int length);

Nedenfor er vist et udsnit af device driveren, ekg.c. Her er desuden angivet hvilke
kodestumper som du skal implementere
// ekg.c
static struct adc ekg_adc;
static struct fifo ekg_fifo;
static struct cdev ekg_dev;
struct file_operations ekg_fops;
static int devno;

static irqreturn_t ekg_isr(int irq, void *dev_id) {


int sample_value;
if(adc_get_value(&ekg_adc, &sample_value) == 0) {
fifo_put(&ekg_fifo, &sample_value, 1); }
return IRQ_HANDLED;
}

static int ekg_init(void)


{
// Fill in required init code, error handling not required
}

ssize_t ekg_read(struct file *filep, char __user *buf, size_t count, loff_t *f_pos)
{
char read_buf[255];
int len;

// Fill in required code, error handling not required


}

struct file_operations ekg_fops =


{
.owner = THIS_MODULE,
.read = ekg_read,
};

Det er således din opgave at færdiggøre de to funktioner ekg_init() og ekg_read().


Fejlhåndtering behøves ikke implementeret. Koden vist ovenfor kan findes som en
c-fil, sp16_kode.c på CampusNet-Fildeling-Assessment-Eksamen

11 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

12 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

13 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

14 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

15 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

16 of 17 02/01/2021, 12.29
Question Writer Quiz Print Version

(20 points) | ___

Question 16 of 16

Hvis vi vil lave en SPI driver som understø)er multiple SPI devices, så skal vi
opre)e en mapning mellem minor numre og SPI devices, men i hvilken funktion
skal vi gøre de)e?

read()
probe()
open()
init()

(5 points) | ___

You have reached the end of the quiz. You may still go back and change your
answers. Click next when you are sure you want to move on.

17 of 17 02/01/2021, 12.29

You might also like