文档介绍:Linux内核的移植技术剖析今天的内容BSP的组成部分plat/mach各组件的实现内核节拍中断管理时钟GPIODMAIO内存映射设备与资源platformdevice、resource和plarformdatauart/spi/i2c等设备板级resourceBSP的组成部分BSP作用为内核的运行提供底层支撑屏蔽与板相关的硬件细节基本组成时钟tick(HZ)的产生系统中断控制的方法GPIO、DMA、时钟资源的统一管理静态映射的IO内存设备的IO、中断、DMA等资源封装平台数据ARMBSP的目录plat-xxxlinux--omap/ plat-pxa/ plat-s3c/plat-s3c24xx/plat-s3c64xx/plat-stmp3xxx/mach-xxxlinux--s3c2400/mach-s3c2410/ mach-s3c2412/ mach-s3c2440/ mach-s3c2442/ mach-s3c2443/ mach-s3c24a0/ mach-s3c6400/ mach-s3c6410/时钟节拍的产生sys_timer和timer_tickstaticirqreturn_ts3c2410_timer_interrupt(intirq,void*dev_id){ timer_tick(); returnIRQ_HANDLED;}staticstructirqactions3c2410_timer_irq={ .name ="S3C2410TimerTick", .flags =IRQF_DISABLED|IRQF_TIMER|IRQF_IRQPOLL, .handler =s3c2410_timer_interrupt,};staticvoid__inits3c2410_timer_init(void){ s3c2410_timer_resources(); s3c2410_timer_setup(); setup_irq(IRQ_TIMER4,&s3c2410_timer_irq);}structsys_timers3c24xx_timer={ .init =s3c2410_timer_init, .offset =s3c2410_gettimeoffset, .resume =s3c2410_timer_setup};系统中断管理irq_chipstaticstructirq_chips3c_irq_uart={ .name ="s3c-uart", .mask =s3c_irq_uart_mask, .unmask =s3c_irq_uart_unmask, .mask_ack =s3c_irq_uart_maskack, .ack =s3c_irq_uart_ack,};staticvoid__inits3c64xx_uart_irq(structuart_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__inits3c64xx_init_irq(u32vic0_valid,u32vic1_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和统一的gpio_xxxAPIstructgpio_chip{int(*request)(structgpio_chip*chip,unsignedoffset);void(*free)(structgpio_chip*chip,unsignedoffset);int(*direction_input)(structgpio_chip*chip,unsignedoffset);int(*get)(structgpio_chip*chip,unsignedoffset);int(*direction_output)(structgpio_chip*chip,unsignedoffset,in