基于arm9的流媒体播放器的设计课程设计(编辑修改稿)内容摘要:

植相应的硬件驱动程序。 Flash 驱动的移植 Flash 存储器在 嵌入式系统中是必不可少的,它是 Bootloader、 Linux 内核 、 文件系统 和数据 的最佳载体。 在 Linux 内核中,引入了 MTD(Memory Technology Device,内存技术设备 )层为 NOR Flash 和 NAND Flash 设备提供统一的接口,从而使得 Flash 驱动的设计工作大为简化 [9]。 在 GQ2440 开发板上有 256M 的 NAND Flash 存储芯片。 Linux 内核在 MTD 的下层实现了通用的 NAND 驱动 (主要通过 driver/mtd/nand/ 文件实现 ),所以要实现 NAND Flash 的驱动并不需要太大的工作量。 S3C2440 的 NAND Flash驱动是以 platform 驱动的形式实现的,在执行 probe()函数时,初始化 nand_chip 实例并运行 nand_scan()函数 扫描 NAND Flash 设备,最后调用 add_mtd_partitions()函数添加 BSP 文件中定义的分区表。 因此只要在 中定义和注册分区表和相关硬件信息即可 完成 NAND Flash 的移植工作。 首先应在 加入 的是 NAND Flash 的分区表的代码: static struct mtd_partition friendly_arm_default_nand_part[] = { [0] = { .name = bootloader, .size = 0x00040000, .offset = 0, }, [1] = { .name = param, 10 .offset = 0x00040000, .size = 0x00020200, }, [2] = { .name = Kernel, .offset = 0x00060000, .size = 0x00500000, }, [3] = { .name = rootfs, .offset = 0x00560000, .size = 1024 * 1024 * 1024, // }, [4] = { .name = nand, .offset = 0x00000000, .size = 1024 * 1024 * 1024, // } }。 接下来还应把开发板的 NAND Flash设置表和 NAND Flash本身的一些特性注册进内核,分别在 中加入以下代码: static struct s3c2410_nand_set friendly_arm_nand_sets[] = { [0] = { .name = NAND, .nr_chips = 1, .nr_partitions = ARRAY_SIZE(friendly_arm_default_nand_part), .partitions = friendly_arm_default_nand_part, }, }。 11 static struct s3c2410_platform_nand friendly_arm_nand_info = { .tacls = 20, .twrph0 = 60, .twrph1 = 20, .nr_sets = ARRAY_SIZE(friendly_arm_nand_sets), .sets = friendly_arm_nand_sets, .ignore_unset_ecc = 1, }。 为了使 NAND Flash 正常 工作,还需把 NAND Flash 设备注册到系统中,把 Nand Flash 设备注册到系统只要将其放入 中定义的 mini2440_devices 数组即可。 除此外我们还应该把 NAND Flash 的一些特性传递给驱动,首先在driver/mtd/nand 目录下找到 NAND Flash 的驱动程序: ,打开文件,在函数 static int s3c2410_nand_setrate(struct s3c2410_nand_info*info)中添加如下代码: struct s3c2410_platform_nand * plat = infoplatform。 再在 中的函数 static void __init mini2440_machine_init(void)里面添加如下代码: = amp。 mini2440_nand_info。 最后重新编译内核即 可 完成了 NAND Flash 驱动的移植。 LCD 驱动的移植 对嵌入式视频播放器来说。 LCD 显示器自然是必不可少 的, 内核已经支持 S3C2440 的 LCD 控制器驱动,只要在 中注册具体的 LCD硬件参数即可完成 LCD 驱动的移植工作。 GQ2440 开发板使用的是统宝的 英寸真彩 色 TFT 液晶屏 ,分辨率为 320x240,带触摸屏的。 图 为 TFT 屏的时序图: 12 图 TFT 屏时序 上图中的 VCLK、 HSYNC、 VSYNC 分别为像素时钟信号、行同步信号和帧同步信号, VDEN 为数据有效标志信号, VD 为图像的数据信号。 图 给出的是 S3C2440 的 LCD 控制器的方 框图, S3C2440 的 LCD 控制器是用与传输视频数据和产生必要的控制信号,如 VFRAME、 VLINE、 VCL、 VM 等,此外还有视频数据端口 VD[23:0]。 图 LCD 控制器方框图 图 给出了 LCD 控制器中应该设置的 TFT 屏的参数,其中的上边界和下边界 13 即为帧切换的回扫时间,左边界和右边界即为行切换的回扫时间,水平同步和垂直同步分别是行和帧同步本身需要的时间。 xres 和 yres 则分别是屏幕的水平和垂直分辨率。 图 TFT 显示屏 参数 因为 已经支持 S3C2440 的 LCD 控制器驱动,所以只需在 LCD显示器填充两个结构体以完成对 LCD显示器平台 信 息 的 注 册 就 可 以 了。 这 两 个 结 构 体 是 s3c2410fb_mach_info 和s3c2410_fb_display。 其中 s3c2410fb_mach_info 用于表示 LCD 显示器的平台信息。 s3c2410_fb_display 用来表示 LCD 设备的机器信息,例如 LCD 显示器的宽度、高度和每个像素占多少位等信息 [6]。 因此根据 GQ2440 开发板使用的 LCD 显示器的特性在 中加入如下代码: if defined(CONFIG_FB_S3C2410_S320240) define LCD_WIDTH 320 define LCD_HEIGHT 240 define LCD_PIXCLOCK 100000 define LCD_RIGHT_MARGIN 8 define LCD_LEFT_MARGIN 5 define LCD_HSYNC_LEN 6 define LCD_UPPER_MARGIN 8 define LCD_LOWER_MARGIN 3 14 define LCD_VSYNC_LEN 10 endif if defined (LCD_WIDTH) static struct s3c2410fb_display arm2440_lcd_cfg __initdata = { if !defined (LCD_CON5) .lcdcon5 = S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP, else .lcdcon5 = LCD_CON5, endif .type = S3C2410_LCDCON1_TFT, .width = LCD_WIDTH, .height = LCD_HEIGHT, .pixclock = LCD_PIXCLOCK, .xres = LCD_WIDTH, .yres = LCD_HEIGHT, .bpp = 16, .left_margin = LCD_LEFT_MARGIN + 1, .right_margin = LCD_RIGHT_MARGIN + 1, .hsync_len = LCD_HSYNC_LEN + 1, .upper_margin = LCD_UPPER_MARGIN + 1, .lower_margin = LCD_LOWER_MARGIN + 1, .vsync_len = LCD_VSYNC_LEN + 1, }。 static struct s3c2410fb_mach_info arm2440_fb_info __initdata = { .displays = amp。 arm2440_lcd_cfg, 15 .num_displays = 1, .default_display = 0, .gpccon = 0xaa955699, .gpccon_mask = 0xffc003cc, .gpcup = 0x0000ffff, .gpcup_mask = 0xffffffff, .gpdcon = 0xaa95aaa1, .gpdcon_mask = 0xffc0fff0, .gpdup = 0x0000faff, .gpdup_mask = 0xffffffff, .lpcsel = 0xf82, }。 endif 然后还要在 driver/video/Kconfig 中加入如下配置信息: config FB_S3C2410_T240320 Boolean “ inch 240X320 Toppoly LCD” depends on FB_S3C2410 Help inch 240X320 Toppoly LCD 接着可以使用 make menuconfig 命令进入内核配置,选择相应的选项并退出保存,然后重新编译内核即完成了 LCD 驱动的移植工作。 UDA1341 音频驱动的移植 GQ2440 开发板上使用的是 UDA1341 音频芯片, 已经完美的支持 UDA1341 的驱动,所以只要在 文件中注册 UDA1341 平台设备的控制端口就可以了,在 中添加如下代码: static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = { .l3_clk = S3C2410_GPB(4), .l3_data = S3C2410_GPB(3), 16 .l3_mode = S3C2410_GPB(2), .model = UDA134X_UDA1341, }。 static struct platform_device s3c24xx_uda134x = { .name = s3c24xx_uda134x, .dev = { .platform_data = amp。 s3c24xx_uda134x_data, } }。 此外还要把 UDA1341 设备添加到 mini2440_devices 数组中 以 UDA1341 设备注册到内核中。 接着我们只要使用 make menuconfig 命令,选择相应的选项并保存退出,再使用 make zImage 命令重新编译内核即可。 根文件系统的制作 对嵌入式系统来说,除了一个嵌入式操作系统以外,还需要一个嵌入式文件系统用来管理和存储数据、程序。 在 Linux 文件系统结构中,内核层的文件系统实现是必须的, Linux 启动时,第一个必须挂载的 就 是根文件系统 [8]。 若系统 正常 挂载根文件系统,则系统会出错而 退出启动,所以要为嵌入式系统构建一个根文件系统。 根文件系统介绍 根文件系统是 Linux 操作系统运行需要的一个文件系统。 在嵌入式领域,使用哪种文件系统需要根据存储芯片的类型来决定,在嵌入式 Linux 应用中,主要的存储设备为 RAM(DRAM, SDRAM)和 ROM(Flash 存储器 ),常用的基于 Flash 存储设备的文件系统类型包括 jffs Yaffs、 Cramfs、 Romfs、 Ramdisk 等 ,而作为根文件系统一般 会 选用 Yaffs 和 Cramfs。 Yaffs 是第一个为 NAND Flash 存储器设计的嵌入式文件系统,适用于大容量的存储设备,并且在 GPL 协议下发布,可免费获得其代码 [9]。 Yaffs 文件系统有 4 个主要 优点:速度快、占用内存少、不支持压缩和只支持 Yaffs 存储器。 Cramf。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。