配色: 字号:
pci-drivers
2014-01-26 | 阅:  转:  |  分享 
  
1

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Linux?PCI?drivers

Linux

PCI?drivers

Michael?Opdenacker

Free?Electrons

http://en.wikipedia.org/wiki/Image:PCI_Slots_Digon3.JPG

??Copyright?2004-2009,?Free?Electrons.

Creative?Commons?BY-SA?3.0?license

Latest?update:?Jul?13,?2010,?

Document?sources,?updates?and?translations:

http://free-electrons.com/docs/pci-drivers

Corrections,?suggestions,?contributions?and?translations?are?welcome!

2

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Linux?PCI?drivers

Understanding?PCI

3

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?bus?family

PCI

32?bit?bus,?33?or?66?MHz

MiniPCI

Smaller?slot?in?laptops

CardBus

External?card?slot?in?laptops

PIX?Extended?(PCI-X)

Wider?slot?than?PCI,?64?bit,?but?

can?accept?a?standard?PCI?card

PCI?Express?(PCIe?or?PCI-E)

Current?generation?of?PCI.?Serial?

instead?of?parallel.

PCI?Express?Mini?Card

Replaces?MiniPCI?in?recent?

laptops

Express?Card

Replaces?CardBus?in?recent?

laptops

The?following?buses?belong?to?the?PCI?family:

These?technologies?are?compatible?and?can?be?handled?by?the?same?kernel?drivers.

The?kernel?doesn''t?need?to?know?which?exact?slot?and?bus?variant?is?used.

4

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?types

Main?types?of?devices?found?on?the?PCI?bus

Network?cards?(wired?or?wireless)

SCSI?adapters

Bus?controllers:?USB,?PCMCIA,?I2C,?FireWire,?IDE

Graphics?and?video?cards

Sound?cards

5

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?features

For?device?driver?developers

Device?resources?(I/O?addresses,?IRQ?lines)?automatically?

assigned?at?boot?time,?either?by?the?BIOS?or?by?Linux?itself?(if?

configured).

The?device?driver?just?has?to?read?the?corresponding?

configurations?somewhere?in?the?system?address?space.

Endianism:?PCI?device?configuration?information?is?Little?Endian.?

Remember?that?in?your?drivers

(conversion?taken?care?of?by?some?kernel?functions).

6

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?list?(1)

lscpi

00:00.0?Host?bridge:?Intel?Corporation?Mobile?945GM/PM/GMS,?943/940GML?and?945GT?Express?Memory?Controller?Hub?(rev?03)

00:02.0?VGA?compatible?controller:?Intel?Corporation?Mobile?945GM/GMS,?943/940GML?Express?Integrated?Graphics?Controller?(rev?03)

00:02.1?Display?controller:?Intel?Corporation?Mobile?945GM/GMS/GME,?943/940GML?Express?Integrated?Graphics?Controller?(rev?03)

00:1b.0?Audio?device:?Intel?Corporation?82801G?(ICH7?Family)?High?Definition?Audio?Controller?(rev?01)

00:1c.0?PCI?bridge:?Intel?Corporation?82801G?(ICH7?Family)?PCI?Express?Port?1?(rev?01)

00:1c.1?PCI?bridge:?Intel?Corporation?82801G?(ICH7?Family)?PCI?Express?Port?2?(rev?01)

00:1c.2?PCI?bridge:?Intel?Corporation?82801G?(ICH7?Family)?PCI?Express?Port?3?(rev?01)

00:1d.0?USB?Controller?[...]

00:1e.0?PCI?bridge:?Intel?Corporation?82801?Mobile?PCI?Bridge?(rev?e1)

00:1f.0?ISA?bridge:?Intel?Corporation?82801GBM?(ICH7-M)?LPC?Interface?Bridge?(rev?01)

00:1f.1?IDE?interface:?Intel?Corporation?82801G?(ICH7?Family)?IDE?Controller?(rev?01)

00:1f.3?SMBus:?Intel?Corporation?82801G?(ICH7?Family)?SMBus?Controller?(rev?01)

02:01.0?CardBus?bridge:?Ricoh?Co?Ltd?RL5c476?II?(rev?b4)

02:01.1?FireWire?(IEEE?1394):?Ricoh?Co?Ltd?R5C552?IEEE?1394?Controller?(rev?09)

02:01.2?SD?Host?controller:?Ricoh?Co?Ltd?R5C822?SD/SDIO/MMC/MS/MSPro?Host?Adapter?(rev?18)

09:00.0?Ethernet?controller:?Broadcom?Corporation?NetXtreme?BCM5752?Gigabit?Ethernet?PCI?Express?(rev?02)

0c:00.0?Network?controller:?Intel?Corporation?PRO/Wireless?4965?AG?or?AGN?Network?Connection?(rev?61)

lspci?-tv

-[0000:00]-+-00.0??Intel?Corporation?Mobile?945GM/PM/GMS,?943/940GML?and?945GT?Express?Memory?Controller?Hub

???????????+-02.0??Intel?Corporation?Mobile?945GM/GMS,?943/940GML?Express?Integrated?Graphics?Controller

???????????+-02.1??Intel?Corporation?Mobile?945GM/GMS/GME,?943/940GML?Express?Integrated?Graphics?Controller

???????????+-1b.0??Intel?Corporation?82801G?(ICH7?Family)?High?Definition?Audio?Controller

???????????+-1c.0-[0000:0b]--

???????????+-1c.1-[0000:0c]----00.0??Intel?Corporation?PRO/Wireless?4965?AG?or?AGN?Network?Connection

???????????+-1c.2-[0000:09]----00.0??Broadcom?Corporation?NetXtreme?BCM5752?Gigabit?Ethernet?PCI?Express

???????????+-1d.0??Intel?Corporation?82801G?(ICH7?Family)?USB?UHCI?Controller?#1?[...]

???????????+-1e.0-[0000:02-06]--+-01.0??Ricoh?Co?Ltd?RL5c476?II

???????????|????????????????????+-01.1??Ricoh?Co?Ltd?R5C552?IEEE?1394?Controller

???????????|????????????????????\-01.2??Ricoh?Co?Ltd?R5C822?SD/SDIO/MMC/MS/MSPro?Host?Adapter

???????????+-1f.0??Intel?Corporation?82801GBM?(ICH7-M)?LPC?Interface?Bridge

???????????+-1f.1??Intel?Corporation?82801G?(ICH7?Family)?IDE?Controller

???????????\-1f.3??Intel?Corporation?82801G?(ICH7?Family)?SMBus?Controller

7

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?list?(2)

lspci?enumerates?all?PCI?devices

02:01.0?CardBus?bridge:?Ricoh?Co?Ltd?RL5c476?II?(rev?b4)

02:01.1?FireWire?(IEEE?1394):?Ricoh?Co?Ltd?R5C552?IEEE?1394?Controller

02:01.2?SD?Host?controller:?Ricoh?Co?Ltd?R5C822?SD/SDIO/MMC/MS/MSPro

Function?number

PCI?device?number

PCI?bus?number

lscpi?-t?shows?the?bus?device?tree

-[0000:00]-+-00.0??Intel?Corporation?Mobile?945GM/PM/GMS,?943/940GML?and?945GT?Express?Memory?Controller?Hub

???????????+-02.0??Intel?Corporation?Mobile?945GM/GMS,?943/940GML?Express?Integrated?Graphics?Controller

???????????+-02.1??Intel?Corporation?Mobile?945GM/GMS/GME,?943/940GML?Express?Integrated?Graphics?Controller

???????????+-1b.0??Intel?Corporation?82801G?(ICH7?Family)?High?Definition?Audio?Controller

???????????+-1c.0-[0000:0b]--

???????????+-1c.1-[0000:0c]----00.0??Intel?Corporation?PRO/Wireless?4965?AG?or?AGN?Network?Connection

???????????+-1c.2-[0000:09]----00.0??Broadcom?Corporation?NetXtreme?BCM5752?Gigabit?Ethernet?PCI?Express

???????????+-1d.0??Intel?Corporation?82801G?(ICH7?Family)?USB?UHCI?Controller?#1?[...]

???????????+-1e.0-[0000:02-06]--+-01.0??Ricoh?Co?Ltd?RL5c476?II

???????????|????????????????????+-01.1??Ricoh?Co?Ltd?R5C552?IEEE?1394?Controller

???????????|????????????????????\-01.2??Ricoh?Co?Ltd?R5C822?SD/SDIO/MMC/MS/MSPro?Host?Adapter

PCI?domain?

PCI?bus?0

PCI?bridgePCI?bus?2

8

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?list?(3)

This?tree?structure?reflects?the?structure?in?/sys:

/sys/devices/pci0000:00/0000:00:1e.0/0000:02:01.2

Bus?0Bus?2PCI?bridge

9

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?configuration?(1)

Each?PCI?device?has?a?256?byte?address?space?containing?

configuration?registers.

Device?configuration?can?be?displayed?with?lspci?-x:

0c:00.0?Network?controller:?Intel?Corporation?PRO/Wireless?

4965?AG?or?AGN?Network?Connection?(rev?61)

00:?86?80?29?42?06?04?10?00?61?00?80?02?10?00?00?00

10:?04?e0?df?ef?00?00?00?00?00?00?00?00?00?00?00?00

20:?00?00?00?00?00?00?00?00?00?00?00?00?86?80?21?11

30:?00?00?00?00?c8?00?00?00?00?00?00?00?05?01?00?00?

10

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?configuration?(2)

Standard?information?found?in?PCI?configurations:

Offset?0:?Vendor?Id

Offset?2:?Device?Id

Offset?10:?Class?Id?(network,?display,?bridge...)

Offsets?16?to?39:?Base?Address?Registers?(BAR)?0?to?5

Offset?44:?Subvendor?Id

Offset?46:?Subdevice?Id

Offsets?64?and?up:?up?to?the?device?manufacturer

Kernel?sources:?these?offsets?are?defined?in?

include/linux/pci_regs.h

11

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Linux?PCI?drivers

Implementing?Linux?drivers

12

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Registering?supported?devices

From?drivers/net/ne2k-pci.c?(Linux?2.6.27):

static?struct?pci_device_id?ne2k_pci_tbl[]?=?{

????????{?0x10ec,?0x8029,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_RealTek_RTL_8029?},

????????{?0x1050,?0x0940,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Winbond_89C940?},

????????{?0x11f6,?0x1401,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Compex_RL2000?},

????????{?0x8e2e,?0x3000,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_KTI_ET32P2?},

????????{?0x4a14,?0x5000,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_NetVin_NV5000SC?},

????????{?0x1106,?0x0926,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Via_86C926?},

????????{?0x10bd,?0x0e34,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_SureCom_NE34?},

????????{?0x1050,?0x5a5a,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Winbond_W89C940F?},

????????{?0x12c3,?0x0058,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Holtek_HT80232?},

????????{?0x12c3,?0x5598,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Holtek_HT80229?},

????????{?0x8c4a,?0x1980,?PCI_ANY_ID,?PCI_ANY_ID,?0,?0,?CH_Winbond_89C940_8c4a?},

????????{?0,?}

};

MODULE_DEVICE_TABLE(pci,?ne2k_pci_tbl);

13

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Registering?a?driver?(1)

Declaring?driver?hooks?and?supported?devices?table:

static?struct?pci_driver?ne2k_driver?=?{

????????.name???????????=?DRV_NAME,

????????.probe??????????=?ne2k_pci_init_one,

????????.remove?????????=?__devexit_p(ne2k_pci_remove_one),

????????.id_table???????=?ne2k_pci_tbl,

#ifdef?CONFIG_PM

????????.suspend????????=?ne2k_pci_suspend,

????????.resume?????????=?ne2k_pci_resume,

#endif?/?CONFIG_PM?/

};

14

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Registering?a?driver?(2)

static?int?__init?ne2k_pci_init(void)

{

????????return?pci_register_driver(&ne2k_driver);

}

static?void?__exit?ne2k_pci_cleanup(void)

{

????????pci_unregister_driver?(&ne2k_driver);

}

The?hooks?and?supported?devices?are?loaded?at?module?loading?

time.

The?probe()?hook?gets?called?by?the?PCI?generic?code

when?a?matching?device?is?found.

Very?similar?to?USB?device?drivers!

15

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Marking?driver?hooks?(1)

__init:?module?init?function.

Code?discarded?after?driver?initialization.

__exit:?module?exit?function.

Ignored?for?statically?compiled?drivers.

__devinit:?probe?function?and?all?initialization?functions

Normal?function?if?CONFIG_HOTPLUG?is?set.?Identical?to?__init?

otherwise.

__devinitconst:?for?the?device?id?table

16

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Marking?driver?hooks?(2)

__devexit:?functions?called?at?remove?time.

Same?case?as?in?__devinit

All?references?to?__devinit?function?addresses?should?be?

declared?with?__devexit_p(fun).?This?replaces?the?

function?address?by?NULL?if?this?code?is?discarded.

Example:?same?driver:

static?struct?pci_driver?ne2k_driver?=?{

????????.name???????????=?DRV_NAME,

????????.probe??????????=?ne2k_pci_init_one,

????????.remove?????????=?

__devexit_p(ne2k_pci_remove_one),

????????.id_table???????=?ne2k_pci_tbl,

...

};

17

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Device?initialization?steps

Enable?the?device

Request?I/O?port?and?I/O?memory?resources

Set?the?DMA?mask?size

(for?both?coherent?and?streaming?DMA)

Allocate?and?initialize?shared?control?data?

(pci_allocate_coherent())

Initialize?device?registers?(if?needed)

Register?IRQ?handler?(request_irq())

Register?to?other?subsystems?(network,?video,?disk,?etc.)

Enable?DMA/processing?engines.

18

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Enabling?the?device

Before?touching?any?device?registers,?the?driver?should?first?

execute?pci_enable_device().?This?will:

Wake?up?the?device?if?it?was?in?suspended?state

Allocate?I/O?and?memory?regions?of?the?device

(if?not?already?done?by?the?BIOS)

Assign?an?IRQ?to?the?device

(if?not?already?done?by?the?BIOS)

pci_enable_device()?can?fail.?Check?the?return?value!

19

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

pci_enable_device?example

From?drivers/net/ne2k-pci.c?(Linux?2.6.27):

static?int?__devinit?ne2k_pci_init_one

????(struct?pci_dev?pdev,

?????const?struct?pci_device_id?ent)

{

...

i?=?pci_enable_device?(pdev);

????????if?(i)

????????????????return?i;

????????...

}

20

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Enabling?the?device?(2)

Enable?DMA?by?calling?pci_set_master().?This?will:

Enable?DMA?by?setting?the?bus?master?bit?in?the?

PCI_COMMAND?register.?The?device?will?then?be?able?to?act?

as?a?master?on?the?address?bus.

Fix?the?latency?timer?value?if?it''s?set?to?something?bogus?by?

the?BIOS.

If?the?device?can?use?the?PCI?Memory-Write-Invalidate?

transaction?(writing?entire?cache?lines),?you?can?also?call?

pci_set_mwi():

This?enables?the?PCI_COMMAND?bit?for?Memory-Write-

Invalidate

This?also?ensures?that?the?cache?line?size?register?is?set?

correctly.

21

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Accessing?configuration?registers?(1)

Needed?to?access?I/O?memory?and?port?information

#include?

Reading:

int?pci_read_config_byte(struct?pci_dev?dev,

?int?where,?u8?val);

int?pci_read_config_word(struct?pci_dev?dev,

?int?where,?u16?val);

int?pci_read_config_dword(struct?pci_dev?dev,

?int?where,?u32?val);

Example:?drivers/net/cassini.c

pci_read_config_word(cp->pdev,?PCI_STATUS,?&cfg);

22

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Accessing?configuration?registers?(2)

Writing:

int?pci_write_config_byte(struct?pci_dev?dev,

??int?where,?u8?val);

int?pci_write_config_word(struct?pci_dev?dev,

??int?where,?u16?val);

int?pci_write_config_dword(struct?pci_dev?dev,

??int?where,?u32?val);

Example:?drivers/net/s2io.c

/?Clear?"detected?parity?error"?bit?

pci_write_config_word(sp->pdev,?PCI_STATUS,?0x8000);

23

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Accessing?I/O?registers?and?memory?(1)

Each?PCI?device?can?have?up?to?6?I/O?or?memory?regions,

described?in?BAR0?to?BAR5.

Access?the?base?address?of?the?I/O?region:

#include?

long?iobase?=?pci_resource_start?(pdev,?bar);

Access?the?I/O?region?size:

long?iosize?=?pci_resource_len?(pdev,?bar);

Reserve?the?I/O?region:

request_region(iobase,?iosize,?“my?driver”);

or?simpler:

pci_request_region(pdev,?bar,?“my?driver”);

or?even?simpler?(regions?for?all?BARs):

pci_request_regions(pdev,?“my?driver”);

24

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Accessing?I/O?registers?and?memory?(2)

From?drivers/net/ne2k-pci.c?(Linux?2.6.27):

ioaddr?=?pci_resource_start?(pdev,?0);

irq?=?pdev->irq;

if?(!ioaddr?||?((pci_resource_flags?(pdev,?0)?&?IORESOURCE_IO)?==?0))?

{

????????dev_err(&pdev->dev,?"no?I/O?resource?at?PCI?BAR?#0\n");

????????return?-ENODEV;

}

if?(request_region?(ioaddr,?NE_IO_EXTENT,?DRV_NAME)?==?NULL)?{

????????dev_err(&pdev->dev,?"I/O?resource?0x%x?@?0x%lx?busy\n",

????????????????NE_IO_EXTENT,?ioaddr);

????????return?-EBUSY;

}

25

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Setting?the?DMA?mask?size?(1)

Use?pci_dma_set_mask()?to?declare?any?device?with?more?(or?

less)?than?32-bit?bus?master?capability

In?particular,?must?be?done?by?drivers?for?PCI-X?and?PCIe?

compliant?devices,?which?use?64?bit?DMA.

If?the?device?can?directly?address?"consistent?memory"?in?System?

RAM?above?4G?physical?address,?register?this?by?calling?

pci_set_consistent_dma_mask().

26

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Setting?the?DMA?mask?size?(2)

Example?(drivers/net/wireless/ipw2200.c?in?Linux?2.6.27):

err?=?pci_set_dma_mask(pdev,?DMA_32BIT_MASK);

if?(!err)

err?=?pci_set_consistent_dma_mask(pdev,?DMA_32BIT_MASK);

if?(err)?{

printk(KERN_WARNING?DRV_NAME?":?No?suitable?DMA?available.\n");

goto?out_pci_disable_device;

}

27

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Allocate?consistent?DMA?buffers

Now?that?the?DMA?mask?size?has?been?allocated...

You?can?allocate?your?cache?consistent?buffers

if?you?plan?to?use?such?buffers.

See?our?DMA?presentation

and?Documentation/DMA-API.txt?for?details.

28

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Initialize?device?registers

If?needed?by?the?device

Set?some?“capability”?fields

Do?some?vendor?specific?initialization?or?reset

Example:?clear?pending?interrupts.

29

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Register?interrupt?handlers

Need?to?call?request_irq()?with?the?IRQF_SHARED?flag,?

because?all?PCI?IRQ?lines?can?be?shared.

Registration?also?enables?interrupts,?so?at?this?point

Make?sure?that?the?device?is?fully?initialized?and?ready?to?

service?interrupts.

Make?sure?that?the?device?doesn''t?have?any?pending?

interrupt?before?calling?request_irq().

Where?you?actually?call?request_irq()?can?actually?

depend?on?the?type?of?device?and?the?subsystem?it?could?be?

part?of?(network,?video,?storage...).

Your?driver?will?then?have?to?register?to?this?subsystem.

30

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?shutdown?(1)

In?the?remove()?function,?you?typically?have?to?undo

what?you?did?at?device?initialization?(probe()?function):

Disable?the?generation?of?new?interrupts.

If?you?don''t,?the?system?will?get?spurious?interrupts,?and?will?

eventually?disable?the?IRQ?line.?Bad?for?other?devices?on?this?

line!

Release?the?IRQ

Stop?all?DMA?activity.

Needed?to?be?done?after?IRQs?are?disabled

(could?start?new?DMAs)

Release?DMA?buffers:?streaming?first?and?then?consistent?

ones.

31

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

PCI?device?shutdown

Unregister?from?other?subsystems

Unmap?I/O?memory?and?ports?with?io_unmap().

Disable?the?device?with?pci_disable_device().

Unregister?I/O?memory?and?ports.

If?you?don''t,?you?won''t?be?able?to?reload?the?driver.

32

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Useful?resources

Documentation/PCI/pci.txt?in?the?kernel?sources

An?excellent?guide?to?writing?PCI?drivers,?which?helped

us?to?write?these?slides.

Book:?Essential?Linux?device?drivers?(Prentice?Hall)

A?very?good?and?recent?book!

http://free-electrons.com/redirect/eldd-book.html

Book:?Linux?Device?Drivers?(O''Reilly)

Available?under?a?free?documentation?license.

http://free-electrons.com/community/kernel/ldd3/

Wikipedia:

http://en.wikipedia.org/wiki/Peripheral_Component_Interconnect

33

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Useful?resources?(2)

PCI?Utilities:?http://mj.ucw.cz/pciutils.html

lspci:?shows?PCI?bus?and?device?information

setpci:?allows?to?manipulate?PCI?device?configuration?

registers

PCI?vendor?and?device?id?repository:

http://pci-ids.ucw.cz/read/PC/

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

Related?documents

All?our?technical?presentations

on?http://free-electrons.com/docs

Linux?kernel

Device?drivers

Architecture?specifics

Embedded?Linux?system?development

Free?Electrons.?Kernel,?drivers?and?embedded?Linux?development,?consulting,?training?and?support.?http//free-electrons.com

How?to?help

You?can?help?us?to?improve?and?maintain?this?document...

By?sending?corrections,?suggestions,?contributions?and?

translations

By?asking?your?organization?to?order?development,?consulting?

and?training?services?performed?by?the?authors?of?these?

documents?(see?http://free-electrons.com/).

By?sharing?this?document?with?your?friends,?colleagues

and?with?the?local?Free?Software?community.

By?adding?links?on?your?website?to?our?on-line?materials,

to?increase?their?visibility?in?search?engine?results.



Custom?Development

System?integration

Embedded?Linux?demos?and?prototypes

System?optimization

Application?and?interface?development

Free?Electrons

Our?services

Embedded?Linux?Training

All?materials?released?with?a?free?license!

Unix?and?GNU/Linux?basics

Linux?kernel?and?drivers?development

Real-time?Linux,?uClinux

Development?and?profiling?tools

Lightweight?tools?for?embedded?systems

Root?filesystem?creation

Audio?and?multimedia

System?optimization

Consulting?and?technical?support

Help?in?decision?making

System?architecture

System?design?and?performance?review

Development?tool?and?application?support

Investigating?issues?and?fixing?tool?bugs

Linux?kernel

Linux?device?drivers

Board?support?code

Mainstreaming?kernel?code

Kernel?debugging

献花(0)
+1
(本文系迎风初开首藏)