linux內(nèi)核移植技術(shù)剖析_第1頁
linux內(nèi)核移植技術(shù)剖析_第2頁
linux內(nèi)核移植技術(shù)剖析_第3頁
linux內(nèi)核移植技術(shù)剖析_第4頁
linux內(nèi)核移植技術(shù)剖析_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

嵌入式培訓(xùn)專家Linux內(nèi)核的移植技術(shù)剖析主講:宋寶華今天的內(nèi)容BSP的組成部分plat/mach各組件的實(shí)現(xiàn)內(nèi)核節(jié)拍中斷管理時鐘GPIODMAIO內(nèi)存映射設(shè)備與資源platform

device、resource和plarform

datauart/spi/i2c等設(shè)備板級resourceBSP的組成部分BSP作用為內(nèi)核的運(yùn)行提供底層支撐屏蔽與板相關(guān)的硬件細(xì)節(jié)基本組成時鐘tick(HZ)的產(chǎn)生系統(tǒng)中斷控制的方法GPIO、DMA、時鐘資源的統(tǒng)一管理靜態(tài)映射的IO內(nèi)存設(shè)備的IO、中斷、DMA等資源封裝平臺數(shù)據(jù)ARM

BSP的目錄plat-xxxlinux-2.6/arch/arm/plat-omap/plat-pxa/plat-s3c/plat-s3c24xx/plat-s3c64xx/plat-stmp3xxx/mach-xxxlinux-2.6/arch/arm/mach-s3c2400/mach-s3c2410/mach-s3c2412/mach-s3c2440/mach-s3c2442/mach-s3c2443/mach-s3c24a0/mach-s3c6400/mach-s3c6410/時鐘節(jié)拍的產(chǎn)生sys_timer和timer_tickstatic

irqreturn_t

s3c2410_timer_interrupt(int

irq,

void

*dev_id){timer_tick();return

IRQ_HANDLED;}static

struct

irqaction

s3c2410_timer_irq

=

{.name.flags.handler=

"S3C2410

Timer

Tick",=IRQF_DISABLED

|IRQF_TIMER

|IRQF_IRQPOLL,=s3c2410_timer_interrupt,};staticvoid

init

s3c2410_timer_init(void){s3c2410_timer_resources();s3c2410_timer_setup();setup_irq(IRQ_TIMER4,

&s3c2410_timer_irq);}struct

sys_timer

s3c24xx_timer

={.init.offset.resume=s3c2410_timer_init,=s3c2410_gettimeoffset,=s3c2410_timer_setup};系統(tǒng)中斷管理irq_chipstatic

struct

irq_chip

s3c_irq_uart

=

{.name.mask.unmask.mask_ack.ack=

"s3c-uart",=

s3c_irq_uart_mask,=

s3c_irq_uart_unmask,=

s3c_irq_uart_maskack,=

s3c_irq_uart_ack,};static

void

init

s3c64xx_uart_irq(struct

uart_irq

*uirq){for(offs=

0;offs<

3;offs++){irq

=

uirq->base_irq

+

offs;set_irq_chip(irq,&s3c_irq_uart);set_irq_chip_data(irq,

uirq);set_irq_handler(irq,

handle_level_irq);set_irq_flags(irq,

IRQF_VALID);}set_irq_chained_handler(uirq->parent_irq,

s3c_irq_demux_uart);}void

init

s3c64xx_init_irq(u32

vic0_valid,

u32

vic1_valid){set_irq_chip(irq,

&s3c_irq_timer);...for(uart

=

0;

uart

<

ARRAY_SIZE(uart_irqs);

uart++)s3c64xx_uart_irq(&uart_irqs[uart]);}GPIO管理gpio_chip和統(tǒng)一的gpio_xxx

APIstruct

gpio_chip

{intvoidintintintvoid(*request)(struct

gpio_chip*chip,unsigned

offset);(*free)(struct

gpio_chip

*chip,unsigned

offset);(*direction_input)(struct

gpio_chip

*chip,unsigned

offset);(*get)(struct

gpio_chip

*chip,unsigned

offset);(*direction_output)(structgpio_chip

*chip,unsigned

offset,

int

value);(*set)(struct

gpio_chip

*chip,unsigned

offset,

int

value);};int

gpio_request(unsigned

gpio,

const

char

*label);void

gpio_free(unsigned

gpio);int

gpio_direction_input(unsigned

gpio);int

gpio_direction_output(unsigned

gpio,

int

value);int

gpio_get_value_cansleep(unsigned

gpio);CLOCK管理提供統(tǒng)一的clk_get、clk_put等API:EXPORT_SYMBOL(clk_get);EXPORT_SYMBOL(clk_put);EXPORT_SYMBOL(clk_enable);EXPORT_SYMBOL(clk_disable);EXPORT_SYMBOL(clk_get_rate);EXPORT_SYMBOL(clk_round_rate);EXPORT_SYMBOL(clk_set_rate);EXPORT_SYMBOL(clk_get_parent);EXPORT_SYMBOL(clk_set_parent);DMA管理統(tǒng)一的DMA

API支持:int request_dma(unsigned

int

chan,

const

char

*device_id);void

free_dma(unsigned

intchan);void

enable_dma(unsigned

int

chan);void

disable_dma(unsigned

int

chan);void

set_dma_mode

(unsigned

int

chan,

unsigned

int

mode);void

set_dma_sg

(unsigned

int

chan,

struct

scatterlist

*sg,

intnr_sg);IO內(nèi)存靜態(tài)映射map_desc和iotable_initstaticstructmap_descs3c_iodesc[]

initdata

=

{{.virtual.pfn.length.type=

(unsigned

long)S3C_VA_SYS,=

phys_to_pfn(S3C64XX_PA_SYSCON),=

SZ_4K,=

MT_DEVICE,},

{...},};void

init

s3c64xx_init_io(struct

map_desc

*mach_desc,

int

size){…iotable_init(s3c_iodesc,ARRAY_SIZE(s3c_iodesc));iotable_init(mach_desc,

size);}platform_device和資源platform_device和resourcestatic

struct

resource

smdk6410_smsc911x_resources[]

=

{[0]

=

{.start

=

0x18000000,.end =

0x18000000

+

SZ_64K

-

1,.flags

=

IORESOURCE_MEM,},[1]

=

{.start

=

S3C_EINT(10),.end =

S3C_EINT(10),.flags

=

IORESOURCE_IRQ|

IRQ_TYPE_LEVEL_LOW,},};static

struct

platform_device

smdk6410_smsc911x

=

{.name.id=

"smsc911x",=-1,.num_resources

=

ARRAY_SIZE(smdk6410_smsc911x_resources),.resource =

&smdk6410_smsc911x_resources[0],};platform數(shù)據(jù)提供與板相關(guān)的硬件設(shè)置數(shù)據(jù)static

struct

smsc911x_platform_config

smdk6410_smsc911x_pdata

={.irq_polarity

=

SMSC911X_IRQ_POLARITY_ACTIVE_LOW,.irq_type.flags=

SMSC911X_IRQ_TYPE_OPEN_DRAIN,=

SMSC911X_USE_32BIT

|SMSC911X_FORCE_INTERNAL_PHY,.phy_interface

=

PHY_INTERFACE_MODE_MII,};static

struct

platform_device

smdk6410_smsc911x

=

{....dev={.platform_data

=&smdk6410_smsc911x_pdata,},};struct

smsc911x_platform_config由對應(yīng)設(shè)備的驅(qū)動定義,而

platform_data則由驅(qū)動引用。SPI板級信息spi_board_infostaticstructspi_board_info

initdata

jive_spi_devs[]={[0]

=

{.modalias.bus_num.chip_select.mode=

"VGG2432A4",=

1,=

0,=

SPI_MODE_3, /*

CPOL=1,

CPHA=1

*/.max_speed_hz =

100000,.platform_data

=

&jive_lcm_config,},

{.modalias.bus_num.chip_select.mode=

"WM8750",=

2,=

0,=

SPI_MODE_0, /*

CPOL=0,

CPHA=0

*/.max_speed_hz =

100000,},};spi_register_board_info(jive_spi_devs,ARRAY_SIZE(jive_spi_devs));I2C板級信息i2c_board_infostaticstructi2c_board_infoi2c_devs0[]

initdata

=

{{

I2C_BOARD_INFO("24c08",

0x50),

},{

I2C_BOARD_INFO("wm8580",

0x1b),

},#ifdef

CONFIG_SMDK6410_WM1190_EV1{

I2C_BOARD_INFO("wm8350",

0x1a),.platform_data

=

&smdk6410_wm8350_pdata,.irq

=

S3C_EINT(12),},#endif};staticvoid

init

smdk6410_machine_init(void){...i2c_register_board_info(0,

i2c_devs0,

ARRAY_SIZE(i2c_devs0));i2c_register_board_info(1,

i2c_devs1,

ARRAY_SIZE(i2c_devs1));...}MACHINE_STARTMACHINE_START(SMDK6410,

"SMDK6410")/*

Maintainer:

Ben

Dooks

<

>

*/.phys_io.io_pg_offst=

S3C_PA_UART

&

0xfff00000,=

(((u32)S3C_VA_UART)

>>

18)

&

0xfffc,.boot_params =

S3C64XX_PA_SDRAM

+

0x100,.init_irq.map_io=s3c6410_init_irq,=smdk6410_map_io,.init_machine =smdk6410_machine_init,.timer =&s3c24xx_timer,MACHINE_END范例:添加LDD6410板修改Kconfig和Makefile:linux-2.6.31/arch/arm/mach-s3c6410/Kconfigconfig

MACH_LDD6410bool

"LDD6410"select

CPU_S3C6410select

S3C_DEV_FBselect

S3C64XX_SETUP_FB_24BPPhelpMachine

support

for

the

LDD6410++++++++config

MACH_SMDK6410bool

"SMDK6410"select

CPU_S3C6410linux-2.6.31/arch/arm/mach-s3c6410/Makefile+obj-$(CONFIG_MACH_LDD6410)

+=

mach-ldd6410.o

obj-$(CONFIG_MACH_SMDK6410)

+=

mach-smdk6410.oobj-$(CONFIG_MACH_NCP)

+=

mach-ncp.o增加新板子的文件:linux-2.6.31/arch/arm/mach-s3c64

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論