You are on page 1of 7

n tt nghip

Trang 19

CHNG 3: TRNH IU KHIN THIT B


3.1 GII THIU DEVICE DRIVER
Device Drivers c gi l trnh iu khin thit b ng mt vai tr c bit
trong nhn Linux (Linux Kernel). N c coi l nhng hp en black boxes v
lm cho phn cng thc thi nhng hm API c nh ngha sn trong kernel.
Chng giu hon ton cc chi tit v cch thit b hot ng
Ngoi ra, chng ta cng c th nhn driver mt quan im khc: n chnh l
lp phn mm nm gia ng dng ngi dng (applications) v thit b thc (actual
device). Cc drivers khc nhau cung cp cc kh nng khc nhau thm ch cho cng
mt thit b nn khi thit k mt driver thc t cn phi xem xt nhiu yu t khc
nhau. Trong , vic cn bng gia nhiu la chn khc nhau cho ngi dng v
thi gian vit cng nh mong mun n gin ha l mt trong nhng iu cn xem
xt chnh.

Hnh 3.1 : Quan h cc tng


Mt trong nhng c tnh hay ca Linux l kh nng cho php m rng ti thi
im chy. iu ny c hiu l chng ta c th thm cc chc nng vo kernel
hoc loi b chng trong khi h thng ang chy. Mi on code c add vo
kernel ti thi im chy c gi l mt module. Linux kernel h tr mt s kiu
khc nhau ca modules trong c device drivers. Mi module c to ra t
object code (cha c link ti file thc thi hon tt). Chng c th d dng kt ni
ti kernel ang chy thng qua chng trnh insmod v ngt kt ni thng qua
chng trnh rmmod

Chng 3 : Trnh iu khin thit b

n tt nghip

Trang 20

Hnh 3.2 : Qu trnh ci t v xa modules

3.2 PHN LOI DEVICE DRIVER


Linux phn chia thit b thnh 3 nhm chnh:
Block device
Network interface.
Character Device
Device c truy cp nh mt byte stream (ging nh mt file) v truy cp tun
t.
Char driver ca character device c nhim v thc hin chc nng ny.N
thng bao gm t nht cc hm h thng nh: open, close, read and write.Char
device c truy cp thng qua node file h thng (filesystem nodes) nh /dev/tty1
v dev/lp0.
iu khc nhau duy nht gia char device and file thng thng l chng ta
ch c th truy cp tun t i vi char device.
Block Device
Ging nh char device, block device c truy cp bi nt h thng
(filesystem) trong th mc /dev. Mt block device l thit b c th s hu mt file
h thng. Trong hu ht cc h thng Unix, thao tc I/O c thc hin theo dng
block thng l 512bytes/ block.
Tuy nhin, Linux cho php ngi dng c th c hoc ghi mt block device
ging nh char device. Kt qu l, block device v char device ch khc nhau 1
im duy nht l cch d liu c lu tr ni bi kernel
Network Device
Th hin di dng cc interface do n l mt thit b c th trao i d
liu vi cc host khc. Thng thng, cc interface l cc thit b phn cng nh
NIC hoc c th l thit b phn mm thun ty nh mt interface o (loopback
interface).
Mt giao tip mng (network interface) lm nhim v gi v nhn d liu
dng packets. Driver ca network device ch yu x l d liu theo packets m
khng cn quan tm n cc tng cao hn nh connection ca TCP. Vic giao tip
gia kernel v network driver hon ton khc so vi char v block driver. Thay v
s dng cc hm h thng nh read v write, chng s dng cc hm h thng lin
Chng 3 : Trnh iu khin thit b

n tt nghip

Trang 21

quan n vic chuyn packets.


Tm li, ngoi tr network device, cc device khc c truy cp thng qua
mt loi file c bit gi l device file. Device file khng ging nh file thng
thng khc im cc truy cp vo device file s c thc hin bi cc hm
tng ng do driver cung cp thay v truy xut a nh cc file thng thng
User Space v Kernel Space
Nh ni trong phn Cu trc nhn Linux, b nh h thng trong Linux c th
c chia ra lm 2 vng ring bit:
Kernel space: ni m nhn chy v cung cp cc dch v ca n.
User space: vng nh ni cc qu trnh ca ngi dng (user processes)
thc thi.
Kernel space c th c truy cp bi cc user processes thng qua s dng
cc hm h thng (system calls). Theo l thuyt, mt module chy trong kernel
space trong khi ng dng (application) chy trong user space. Unix s chuyn
thc thi t user space sang kernel space khi cc ng dng gi ti cc system calls
hoc b dng bi cc ngt phn cng
Cc ng dng thng chy theo tun t t bt u ti kt thc v khng quan
tm ti bt c iu g xy ra c th thay i mi trng ca n. Kernel Code c
xy dng trn tng nhiu processes c th chy cng lc, s dng mt driver ti
cng thi im.
iu ny c nh ngha l s thc thi ng thi trong lp trnh kernel
(concurrency in kernel programming).
Mc d kernel modules khng thc thi tun t nh application, cc tc v trong
kernel u c thc hin da trn mt process c th. Lnh kernel c th ch ra
process ang thc thi bng cch truy cp bin ton cc current, c nh ngha
trong th vin <asm/current.h>.
3.3 CU TRC CA DEVICE DRIVER
Hu ht cc hot ng driver c bn c 3 cu trc d liu quan trng sau, c
gi l file_operations, file, v inode
File Operations
Chng ta d tr mt s device numbers cho vic s dng ca chng ta.
Nhng chng ta cng cha bao gi kt ni bt k hot ng no ca driver
(drivers operation) n nhng number . Cu trc file_operations l lm th no
mt char driver thit lp nhng kt ni . Cu trc c nh ngha trong
<linux/fs.h> , l mt tp hp ca nhng con tr hm. Mi ln m file ( c m t
ni bi mt cu trc file ) c thch hp vi chnh vic thit lp hm ca chnh n.
( bng vic bao gm mt trng c gi l f_op ch n cu trc file_operations).
Mt file_operations structure hoc mt pointer ti n c gi fops . mi
trng bn trong sturcture phi ch n hm trong driver thc hin mt hot ng
Chng 3 : Trnh iu khin thit b

n tt nghip

Trang 22

c bit hoc tr li NULL cho hot ng khng h tr


struct file_operations gpio_fops =
{
.ioctl= gpio_ioctl,
.open= gpio_open,
.release = gpio_close,
}
The Struct file
Struct file, c nh ngha trong <linux/fs.h>, l cu trc d liu quan trng
th hai c s dng trong device drivers. Ch l mt file khng c th g
lm vi FILE pointers ca chng trnh user-space. Mt FILE c nh ngha
trong th vic C v cha bao gi xut hin trong kernel code. Mt struct file, mt
khc, l mt cu trc kernel cha bao gi xut hin trong khng gian ngi s
dng.
Cu trc file m t mt file m . n c to bi kernel trn open v c gn
ti bt k hm no hot ng trn file cho ti khi c ng. Sau khi hu ht
cc trng hp ca file dc ng, kernel gii phng cu trc d liu.
Trong kernel sources, mt con tr ti struct file thng c gi l file hoc filp
mode_t f_mode;
loff_t f_pos;
unsigned int f_flags;
struct file_operations *f_op;
void *private_data;
struct dentry *f_dentry;
The inode Structure
Cu trc inode c s dng bi kernel ni m t files. v vy, n l khc bit
so vi file structure c s dng m t mt file descriptor. C th c nhiu file
strcuctures m t nhiu open descriptors trn mt file n, nhng chng hu nh ch
ti mt cu trc inode n.
Cu trc inode cha ng mt tng ln ca thng tin v file. nh l mt vai
tr chung, ch c hai trng ca cu trc c quan tm cho vic vit driver code
dev_t i_rdev;
struct cdev *i_cdev;

Chng 3 : Trnh iu khin thit b

n tt nghip

Trang 23

3.4 V D V CHARACTER DEVICE


Mt th d v Character Device l chng trnh gpio_dev( ph lc A):
Gii thch chng trnh:
Chc nng chi tit ca tng hm v cc tc v tng ng:

HNH 3.3 : Cu trc Gpio


Hm module_init:
c gi khi module lin kt vi kernel thng qua lnh insmod.
Thc hin vic ng k device number(major& minor) v lin kt cc tc v
file_operations vi character device.
Hm module_exit:
c gi khi module b g b khi nhn qua lnh rmmod. Thc hin vic g
b device khi h thng.
Tc v open:
c nh ngha bng hm gpio_open(). Hm thc hin m device.
Tc v release:
c nh ngha bng hm gpio_close(). Hm thc hin ng device.

Chng 3 : Trnh iu khin thit b

n tt nghip

Trang 24

Tc v ioctl:
S dng iu khin cc hnh vi khc nhau ca device bng cu trc
switch_case
Ty theo gi tr ca thng s cmd truyn t user, cc hm tng ng c
gi:
Gi hm gpio_get_value (arg) nhn trng thi hin ti ca chn vi tham s
arg l s th t chn.
Gi hm gpio_set_value(arg, 1) thit lp gi tr ti arg ln 1.
Gi hm gpio_set_value(arg, 0) thit lp gi tr ca arg ln 0.
Gi hm GPIO_DIR_IN(arg) thit lp chn ti arg thnh chn c ch vo.
Gi hm gpio_direction_output(arg, 0) thit lp chn ti arg thnh ch
ng ra.
cp software, h iu hnh Linux phn chia thnh 2 khng gian hot ng,
gi l user space v kernel space. Chng trnh ng dng (user program) thuc v
user space v kernel module, driver thuc v kernel space. Vi s phn chia trn, 1
chng trnh ng dng khng th truy xut trc tip cc gpio ca MPU theo kiu
lp trnh firmware truyn thng, trong khi kernel module, driver c th d dng thc
hin iu ny. Chng trnh ng dng truy xut gpio thng qua driver. V pha
driver, cc pin gpio_number ca AT91SAM9260 MPU c khai bo trong header
file: "arch/arm/mach-at91/include/mach/gpio.h"
AT91_PIN_PA0, AT91_PIN_PB0, AT91_PIN_PC0 ...
V d :
#defineAT91_PIN_PA0 (PIN_BASE + 0x00 + 0)
#defineAT91_PIN_PB0 (PIN_BASE + 0x20 + 0)
#defineAT91_PIN_PC0 (PIN_BASE + 0x40 + 0)
#defineAT91_PIN_PD0 (PIN_BASE + 0x60 + 0)
...

Chng 3 : Trnh iu khin thit b

n tt nghip

Trang 25

V PIN_BASE c nh ngha trong header file "irqs.h" v c gi tr l 32.


Nh vy ta c th quy i ra gpio_number theo cng thc nh sau:
1. Pin name c dng P<letter><number>
2. gpio_number = 32*letter + number : A = 1, B = 2, C = 3 ...
3. V d : PC6 => gpio_number = 32*3+6 = 102
Sau y l v d cho kernel module c tn gi l gpio_dev, driver cho php
chng trnh ng dng truy xut gpio pin trn MPU, bao gm cc IO control set
chiu input, ouput, set bit, clear bit. Chng trnh ng dng s dng driver ny
thng qua device file c tn l "/dev/gpio". Sau y l v d cho kernel module vi
source file c tn l "gpio_dev.c".
Sau khi build thnh cng kernel module (trn my PC Linux), ta c file
gpio_dev.ko. chy c module, ta chp gpio_dev.ko vo th mc trong / v
thc hin cc lnh insert module vo h thng:
$ insmod gpio_dev.ko
$ lsmod
Module

Size Used by

gpio_dev

2432 0

V pha ng dng, ta c th set pin gpio ca AT91SAM9260 MPU ch


input, output, set bit, clear bit theo c php nh sau:
$ ./gpioctl dirin|dirout|get|set|clear gpio_num

V d: Cu hnh PB20 as output v set pin ny ln 1 ta thc hin lnh sau:


$ ./gpioctl dirout 84
using gpio pin 84
$ ./gpioctl set 84
using gpio pin 84

Chng 3 : Trnh iu khin thit b

You might also like