2.4.21MTD驱动移植文档
嵌入式Linux之我行——u-boot-2009_08在2440上的移植详解(五) - Bootloader移植篇 - hbhuanggang

Yaffs 页结构说明 ============================================== 字节 用途
============================================== 0 - 511 512 - 515 516 517 存储数据(分为两个半部) 系统信息 数据状态字 块状态字
*buffer) { int rval; size_t left_to_write = *length; size_t len_incl_bad; u_char *p_buffer = buffer; #if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if(nand->rw_oob==1) { size_t oobsize = nand->oobsize; size_t datasize = nand->writesize; int datapages = 0; if (((*length)%(nand->oobsize+nand->writesize)) != 0) { printf ("Attempt to write error length data!\n"); return -EINVAL; } datapages = *length/(datasize+oobsize); *length = datapages*datasize; left_to_write = *length; } #endif /* Reject writes, which are not page aligned */ if ((offset & (nand->writesize - 1)) != 0 || (*length & (nand->writesize - 1)) != 0) { printf ("Attempt to write non page aligned data\n"); return -EINVAL; } len_incl_bad = get_len_incl_bad (nand, offset, *length); if ((offset + len_incl_bad) >= nand->size) { printf ("Attempt to write outside the flash area\n"); return -EINVAL; } #if !defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if (len_incl_bad == *length) { rval = nand_write (nand, offset, length, buffer); if (rval != 0) printf ("NAND write to offset %llx failed %d\n", offset, rval); return rval; } #endif while (left_to_write > 0) { size_t block_offset = offset & (nand->erasesize - 1); size_t write_size; WATCHDOG_RESET (); if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) { printf ("Skip bad block 0x%08llx\n", offset & ~(nand->erasesize - 1));
mtd驱动分析

函数功能列表说明struct request *elv_next_reques(request_queue_t *queue);void end_request(struct request *req, int success);elv_next_request 从一个请求队列中获得下一个请求; end_request 可用在每个简单驱动器中来标识一个(或部分)请求完成.1)数据结构struct mtd_partition {char *name; /* identifier string */uint64_t size; /* partition size */uint64_t offset; /* offset within the master MTD space */uint32_t mask_flags; /* master MTD flags to mask out for this partition */struct nand_ecclayout *ecclayout; /* out of band layout for this partition (NAND only)*/ };/** bank geometry*/typedef struct ath_flash_geom {uint32_t size;uint32_t sector_size;uint32_t nsectors;uint32_t pgsize;} ath_flash_geom_t;struct mtd_part_parser {struct list_head list;struct module *owner;const char *name;int (*parse_fn)(struct mtd_info *, struct mtd_partition **, unsigned long);};2)init_mtd模块初始化static struct class mtd_class = {.name = "mtd",.owner = THIS_MODULE,.suspend = mtd_cls_suspend,.resume = mtd_cls_resume,};init_mtd(void)(1)class_register(&mtd_class);(2)proc_mtd = create_proc_entry( "mtd", 0, NULL )3)cmdline_parser模块初始化static struct mtd_part_parser cmdline_parser = {.owner = THIS_MODULE,.parse_fn = parse_cmdline_partitions,.name = "cmdlinepart",};cmdline_parser_init(void) ---》register_mtd_parser(&cmdline_parser);list_add(&p->list, &part_parsers);4)ath_flash模块初始化ath_flash_init(void)(1)index = ath_flash_probe();geom = &flash_geom_tbl[index];(2)mtd->erase = ath_flash_erase;mtd->read = ath_flash_read;mtd->write = ath_flash_write;(3)np = parse_mtd_partitions(mtd, part_probes, &mtd_parts, 0); ---》parser = get_partition_parser(*types);(4)ret = (*parser->parse_fn)(master, pparts, origin); ---》parse_cmdline_partitions(struct mtd_info *master,struct mtd_partition **pparts,unsigned long origin) ---》mtdpart_setup_real(cmdline); ---》parts = newpart(p + 1, /* cmdline */&s, /* out: updated cmdline ptr */&num_parts, /* out: number of parts */0, /* first partition */(unsigned char**)&this_mtd, /* out: extra mem */mtd_id_len + 1 + sizeof(*this_mtd) +sizeof(void*)-1 /*alignment*/);/* Added by Ding Hucheng 2011-11-01 */ ????????????if (!strcmp(part->parts[i].name, "ART"))art_part_addr = (unsigned int)part->parts[i].offset + 0xbf000000;else if (!strcmp(part->parts[i].name, "log"))log_part_addr = (unsigned int)part->parts[i].offset + 0xbf000000;else if (!strcmp(part->parts[i].name, "manu"))manu_part_addr = (unsigned int)part->parts[i].offset + 0xbf000000;/* End */(5)add_mtd_partitions(mtd, mtd_parts, np); ---》mtd_part *add_one_partition(struct mtd_info *master,const struct mtd_partition *part, int partno,uint64_t cur_offset) ---》slave->mtd.read = part_read;slave->mtd.write = part_write;slave->mtd.point = part_point;slave->mtd.unpoint = part_unpoint;slave->mtd.erase = part_erase;add_mtd_device(struct mtd_info *mtd) ---》dev_set_name(&mtd->dev, "mtd%d", i);dev_set_drvdata(&mtd->dev, mtd);device_register(&mtd->dev)注册设备5)init_mtdblock模块初始化static struct mtd_blktrans_ops mtdblock_tr = {.name = "mtdblock",.major = 31,.part_bits = 0,.open = mtdblock_open,.flush = mtdblock_flush,.release = mtdblock_release,.readsect = mtdblock_readsect,.writesect = mtdblock_writesect,.add_mtd = mtdblock_add_mtd,.remove_dev = mtdblock_remove_dev,.owner = THIS_MODULE,};register_mtd_blktrans(&mtdblock_tr) ---》(1)register_blkdev(tr->major, tr->name);(2)tr->blkcore_priv->rq =blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock);---》struct mtd_blktrans_ops *tr = rq->queuedata;wake_up(&tr->blkcore_priv->thread_wq);(3)ret = kernel_thread(mtd_blktrans_thread, tr, CLONE_KERNEL);5)mtbblock设备读过程6)mtbblock设备写过程。
Ctp驱动的移植修改 v1.0

= port:PH21<6><default> = port:PB13<1><default><default><1> = port:PH20<1><default> = port:PH21<0><default>
在 sysconfig 中的 ctp 子健 reset, wakeup 的作用对象,因为不属于主控模块,其在语义 上是对模块的操作,配置应根据对外挂模块的操作决定; sysconfig 中的配置,要求 reset 配置,与触控 ic reset 连接的主控引脚对应; 要求 wakeup 配置,与触控 ic wakeup 连接的主控引脚对应;
2. 环境准备
为加快外挂触控 ic 的移植速度,规范研发流程,请先确保以下调试环境和工具可用: 硬件: � 串口可以正常打印; 软件: � 开发环境要求能生成可在开发平台上运行的固件; � 在 linux kernel 目录下,有对应生成该固件的.config 文件; � Adb 可用; � 文件系统可写 � 串口打印相关的 loglevel>7; � 打开 i2c 通讯相关的打印; 如何做到以上要求,参见调试一节,若不清楚,可咨询系统整合相关人员;
Ctp 驱动的移植
1. 前言
触摸作为重要的输入设备,在人机交互中,有着重要作用。在完成一个方案时,应尽早 完成触摸驱动的移植,有利于后期其他模块的调试和测试。然而,触摸驱动的移植,并不是 越早开始越好,我们建议,应在 linux 核心系统稳定及屏幕点亮后,开始进行,这样在触摸 移植后,就能顺利进入 android 系统,并能在 android 层对触摸驱动进行充分测试,保证良 好的触控效果。 Ctp:configurable touch panel 的简称;本文档,讲述外挂触控驱动的移植,包含环境准备, 硬件连接,软件,调试等部分; � 在移植之前,搭建良好的开发环境是必要的,这将有利于后期调试时 bug 的定位, 及 时地获取相关人员的支持,从而更快速的完成移植; � 硬件连接,请先确定硬件连接是否正确,正确的硬件连接,请参考 Reset,Wakeup 信 号的配置, 并确定其他信号,电源电位正常; � 软件,是驱动移植要实现的代码部分;就触摸驱动而言,就是要实现向内核上报用户 操作信息;包含从硬件获取用户操作信息和上报两个部分;上报部分,每个驱动都是 类似的,通常,原厂提供的 demo 已经实现了,可需略作修改即可;从硬件获取用户 操作信息是触摸移植过程中,要达到的主要目的,触摸驱动中,我们要关心的,也主 要是这部分代码;文中,先介绍触摸驱动在系统中的层次,介绍其应该实现的功能, 以及在 a10 bsp 上如何实现驱动,最后,介绍了我们提取的平台相关操作集,它在 bsp 上,针对 ctp 驱动移植的实际场景,简化了移植过程,提高了效率,代码风格也更为 一致,这是我们推荐的 ctp 驱动移植的方法; � 调试,是驱动移植过程中,解决问题的必要手段,因为遇到的问题,我们不可能完全 预见,因而,仅能提供调试方法介绍,并就常见的问题提出建议;
MTK详解LCD移植

详解LCD移植1.Make文件设置设置LCDLCD_MODULE = BROADMOBI68_09B_LCM //这个名字可以自己取,但是//这个名字要和\custom\drv\LCD\下的文件夹一致。
//一般可以不用改。
到时直接修改这个文件夹下的代码就行了。
# Based on the LCM solutions (even multiple LCM modules for this project) # SHOULD BE ONE OF THE FOLLOWINGS, based on the LCM# MTKLCM - Mono, 102x64# MTKLCM_COLOR - Color, 120x160, for MT6218_MW001 or MT6205_CEVB# ORDNANCELCM - Mono, 112x64# KLMLCM - Color, 128x128# INFOLCM - Color, 128x128# TOPPOLY_LCM - Color, 128x160, for MT6218B_EVB# SONY_LCMMAIN_LCD_SIZE = 320X480 //查LCD datasheet可以查到分辨率。
# To distinguish the main lcd size.# We can use it to copy the matching resources, such themecomponents.h, Fontres.c, L_xxx.h, etc, to PLUTO_MMI folderSUB_LCD_SIZE = NONE# NONE, 48X64BW, 64X96, 96X64BW, 96X64, 128X128COM_DEFS_FOR_BROADMOBI68_09B_LCM = BROADMOBI68_09B_LCM TFT_MAINLCD //如果//上面的LCD_MOULE设置改了,这个就要跟着该。
实验九 LCD驱动移植

GEC2410&linux2.6.24&LCD在linux-2.6.24的内核结构中对寄存器lcdcon1-4全部用函数进行了自动设置,我们只需对lcdcon5进行设置,重点在这几个数值上例如:.left_margin=21,该值的计算是根据内核LCD寄存器取值的定义函数S3C2410_LCDCON3_HFPD(var->left_margin-1)HFPD的数据可以根据芯片厂商的说明手册来获取。
可确定(left_margin–1)的值等于20,即left_margin为21..left_margin=21..right_margin=39.hsync_len=31.upper_margin=16.lower_margin=13.vsync_len=4VSPW:垂直同步信号的脉宽,单位为1行(Line)的时间。
VFPD:垂直同步信号的前肩,单位为1行(Line)的时间。
VBPD:垂直同步信号的后肩,单位为1行(Line)的时间。
LINEVAL:垂直显示尺寸-1,即屏行宽-1。
HBPD:水平同步信号的后肩,单位为1VCLK的时间。
HFPD:水平同步信号的前肩,单位为1VCLK的时间。
HSPW:水平同步信号的脉宽,单位为1VCLK的时间。
HOZVAL:水平显示尺寸-1,即屏列宽-1。
1、在linux-2.6.24/arch/arm/mach-s3c2410/mach-smdk2410.c中添加如下的LCD配置源码:首先添加LCD头文件#include<asm/arch/fb.h>然后添加以下代码:static struct s3c2410fb_display gec2410_lcd_cfg[]__initdata={{/*Config for240x320LCD*/.lcdcon5=S3C2410_LCDCON5_FRM565|S3C2410_LCDCON5_INVVLINE|S3C2410_LCDCON5_INVVFRAME|S3C2410_LCDCON5_PWREN|S3C2410_LCDCON5_HWSWP,.type=S3C2410_LCDCON1_TFT,.width=320,.height=240,.pixclock=170000,.xres=320,.yres=240,.bpp=16,.left_margin=21,.right_margin=39,.hsync_len=31,.upper_margin=16,.lower_margin=13,.vsync_len=4,}static struct s3c2410fb_mach_info gec2410_fb_info__initdata={.displays=gec2410_lcd_cfg,.num_displays=ARRAY_SIZE(gec2410_lcd_cfg),.default_display=0,.gpccon=0xaa955699,.gpccon_mask=0xffc003cc,.gpcup=0x0000ffff,.gpcup_mask=0xffffffff,.gpdcon=0xaa95aaa1,.gpdcon_mask=0xffc0fff0,.gpdup=0x0000faff,.gpdup_mask=0xffffffff,.lpcsel=((0xCE6)&~7)|1<<4,};2、然后在static void__init smdk2410_init(void)初始化函数中添加LCD初始化功能。
tslib移植(触摸屏驱动)说明文档

移植问题二:tslib1.4编译过程./autogen.shecho "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache# 设置目标机型,缓冲,安装路径./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=/opt/tslib make# 如果目标路径没有权限,需要加 sudomake install可能遇到的错误In file included from /usr/include/fcntl.h:252:0,from /usr/include/sys/fcntl.h:1,from ts_calibrate.c:20:In function ‘open’,inlined from ‘main’ at ts_calibrate.c:227:11:/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declare d with attribute error: open with O_CREAT in second argument needs 3 arguments In function ‘open’,inlined from ‘main’ at ts_calibrate.c:229:11:/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declare d with attribute error: open with O_CREAT in second argument needs 3 arguments make[2]: *** [ts_calibrate.o] Error 1make[2]: Leaving directory `/home/ouyang/Downloads/tslib/tests'make[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/home/ouyang/Downloads/tslib'make: *** [all] Error 2gcc 新版本编译器对语法检查严格,在源文件 ./tests/ts_calibrate.c 中// 源文件// if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {// cal_fd = open (calfile, O_CREAT | O_RDWR);// } else {// cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);// }// 需要更改成如下形式if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);} else {cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR, 0777); }保存后重新编译即可/zhandoushi1982/article/details/5149086。
RT3070驱动移植
RT3070驱动移植无线网卡为RT3070,驱动分为STA驱动和SoftAP驱动两种,STA驱动支持无线网卡工作在STA模式下,而SoftAP的驱动支持无线网卡工作在软AP的模式下,可以作为一个软的接入点。
STA驱动为2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO.bz2。
SoftAP的驱动是:2010_0203_RT3070_SoftAP_v2.4.0.1_DPA.bz2。
需要移植STA驱动和SoftAP驱动,两款驱动的移植步骤差不多。
下边首先对STA驱动进行移植。
STA驱动的移植#tar jxvf 2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO.bz2cd 2010_0831_RT3070_Linux_STA_v2.3.0.0_DPO修改原有的Makefile文件如下(只给出需要修改的部分,“-”表示删除的行,“+”表示添加的行):+#Makefile for RT3070 on MBC-SAM9G45+#2010_11_13 by liyiRT28xx_MODE = STATARGET = LINUXCHIPSET = 3070-PLATFORM = PC+PLATFORM = IXPifeq ($(PLATFORM),IXP)-LINUX_SRC = /project-CROSS_COMPILE = arm-linux-+LINUX_SRC = /home/Embest_SAM9G45/linux-2.6.30+CROSS_COMPILE = /usr/local/arm2007q1/bin/arm-none-linux-gnueabi-endif修改os/linux文件夹中的config.mk文件,需要修改的地方如下(只给出需要修改的部分):# Support Wpa_Supplicant- HAS_WPA_SUPPLICANT=n+HAS_WPA_SUPPLICANT=y# Support Native WpaSupplicant for Network Maganger-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=yifeq ($(PLATFORM),IXP)- WFLAGS += -DRT_BIG_ENDIAN+#WFLAGS += -DRT_BIG_ENDIANendififeq ($(PLATFORM),IXP)EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/includeendififeq ($(PLATFORM),IXP)- CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include-I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS)- EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include- export CFLAGS-+endif修改完成以后,通过以下命令编译:make ARCH=arm KBUILD_NOPEDANTIC=1如果不加KBUILD_NOPEDANTIC=1将出现CFLAGS was changed in …. Fix it to use EXTRA_CFLAGS的错误,编译不能通过。
MTD原始设备与FLASH硬件驱动的对话_luofuchong
MTD原始设备与FLASH硬件驱动的对话luofuchong看了<<Linux MTD源代码分析>>后对以MTD的分层结构以及各层的分工情况有了大致的了解,然而各层之间是如何进行对话的呢,对于这个问题,<<Linux MTD源代码分析>>上没有详细的去说明。
小弟抽空研究了一下,打算从下到上,在从上到下,分两条主线来研究一下MTD原始设备与FLASH硬件驱动的对话(MTD原始设备与更上层的对话留待以后再研究)。
以下是第一部分,从下到上的介绍FLASH硬件驱动与MTD原始设备是如何建立联系的。
1、首先从入口函数开始:static int s3c24xx_nand_probe(struct device *dev, int is_s3c2440){struct platform_device *pdev = to_platform_device(dev);struct s3c2410_platform_nand *plat = to_nand_plat(dev);//获取nand flash配置用结构体数据(dev.c中定义,详细见附录部分)struct s3c2410_nand_info *info;struct s3c2410_nand_mtd *nmtd;struct s3c2410_nand_set *sets;struct resource *res;int err = 0;int size;int nr_sets;int setno;pr_debug("s3c2410_nand_probe(%p)\n", dev);info = kmalloc(sizeof(*info), GFP_KERNEL);if (info == NULL) {printk(KERN_ERR PFX "no memory for flash info\n");err = -ENOMEM;goto exit_error;}memzero(info, sizeof(*info));dev_set_drvdata(dev, info); //以后有用spin_lock_init(&info->controller.lock); //初始化自旋锁init_waitqueue_head(&info->controller.wq); //初始化等待队列/* get the clock source and enable it */info->clk = clk_get(dev, "nand");if (IS_ERR(info->clk)) {printk(KERN_ERR PFX "failed to get clock");err = -ENOENT;goto exit_error;}clk_use(info->clk);clk_enable(info->clk);/* allocate and map the resource *//* currently we assume we have the one resource */res = pdev->resource; //提取dev.c中定义的与设备相关的资源size = res->end - res->start + 1;info->area = request_mem_region(res->start, size, pdev->name);if (info->area == NULL) {printk(KERN_ERR PFX "cannot reserve register region\n");err = -ENOENT;goto exit_error;}info->device = dev;info->platform = plat; //保存好struct s3c2410_platform_nand 结构数据info->regs = ioremap(res->start, size);//映射nand flash用到的寄存器info->is_s3c2440 = is_s3c2440;if (info->regs == NULL) {printk(KERN_ERR PFX "cannot reserve register region\n");err = -EIO;goto exit_error;}printk(KERN_INFO PFX "mapped registers at %p\n", info->regs);/* initialise the hardware */err = s3c2410_nand_inithw(info, dev);//初始化s3c2410 nand flash控制,主要是配置S3C2410_NFCONF寄存器if (err != 0)goto exit_error;sets = (plat != NULL) ? plat->sets : NULL;nr_sets = (plat != NULL) ? plat->nr_sets : 1;info->mtd_count = nr_sets;//我的板上只有一块nand flash,配置信息见plat-sets,数目为1。
展讯LCD_tp_camera驱动移植
一、编译:1、cd /home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5ls2、source build/envsetup.shlunch3、KONKA_D7-userdebug或者P5_Russia-userdebug(通用版本)4、kheader5、全部编译make -j8 2>&1 | tee build.log部分编译(改代码时)make bootloader -j8 2>&1 | tee build.logmake bootimage -j8 2>&1 | tee build.log二、克隆:三、下载:1、out/target,考出pac文件,boot.img和u-boot.bin,加载pac文件,然后下载2、每次改完代码,需要重新编译,并且加载pac文件四、改时序:lcd_ili9881c_mipi_1491sl_p5_qc.c里面改五、重新编译:重新编译完,删除/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/out/target/product/1491sl_p5_ hd/obj/u-boot64/drivers/video/sprdfb/lcd目录下的文档六、屏的调试1、LCD驱动初始化,各寄存器的含义。
2、通道数要对应,lan.number和0X80的值,01代表2通道,02代表3通道,03代表4通道七、摄像头增加新型号1、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/vendor/sprd/modules/libcamer a/sensor中的Sprdroid.mk中增加local_src_files目录(先要把驱动文件拷过来,打开驱动文件里边的.c查看变量名称,与文件名无关,与路径有关)2、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/vendor/sprd/modules/libcamer a/oem2v0/src中的sensor_cfg.c中增添型号(对照已有的型号格式)3、改完之后编译systemimage,编译过程或错误查看build.log4、调试摄像头时,如果通信不成功,先检查是否接触不良八、adb devices读不到1、网上做法加设备ID2、检查adb环境是否配置好3、重新下载一次系统九、adb shelladb logcat > '/home/android/test.log' 抓取操作流程日志十、打包1、代码:运行imgpac:cd /home/android/gmk/test/983x_NATIVE_6_s801然后./imgpac(打包程序)2、手动打包:用ReseachDownload点击packet十一、无法对焦1、将#define CONFIG_CAMERA_AUTOFOCUS_NOT_SUPPORT注释掉,目录为/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/vendor/sprd/modules/libcamer a/sensor/gc5025_1713_KONKA_D7十二、新增LCD1、在kernel和uboot中加入驱动代码.c文件2、在驱动所在目录的Makefile中加入语句obj-$(CONFIG_FB_LCD_JD9365_MIPI) += $(filter lcd_jd9365_mipi_%,$(CTL_LCD)).o3、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/u-boot64/drivers/video的sprdfb_panel.c中加:#ifdef CONFIG_FB_LCD_JD9365_MIPI{.lcd_id = 0x9365,.panel = &lcd_jd9365_mipi_spec,},#endif4、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/kernel/arch/arm/configs的deconfig中加CONFIG_FB_LCD_JD9365_MIPI=y5、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd/project中的P5_Russia.mk中改CTL_LCD6、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/u-boot64/include/configs 的1491SL.h中加#define CONFIG_FB_LCD_JD9365_MIPI7、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/kernel/drivers/video/sprdfb 的Kconfig中添加:config FB_LCD_JD9365_MIPIboolean "support JD9365 mipi panel"depends on FB_SC8825 || FB_SCX35 || FB_SCX15 || FB_SCX30G || FB_SCX35Ldefault n8、新加之前注意将之前的lcd屏蔽掉(deconfig和configs都要注释掉),或加在前面,以免遍历编译时出错“未找到创建规则创建所需的.o文件”9、注意u-boot和kernel驱动代码不完全相同,分开改,以免出错“函数未定义”10、屏不亮时,先检查是否电池没电11、图像偏大或者点的位置与触屏不符,考虑频率密度,修改/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd中的system.prop中的ro.sf.lcd_density,854*480为24012、开机白屏,检查初始化,很有可能13、编译出错时,先检查error错误,有可能是头文件的事(直接复制过来的头文件可能有错,可参考其他lcd的代码)14、检查out/obj,看kernel和u-boot有没有编译进去15、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd/modem_bins里放的是开机画面logo,图片的分辨率是固定的16、很多行出现错误时,检查大括号是不是漏掉一个十三、修改LCD读ID 部分代码1、看规格书,ID存在哪个寄存器内2、按照已有的格式改修代码十四、查看LCD_id1、adb shell进入环境2、adb root3、cat /proc/cmdline十五、1、任务:兼容10802和7701两个屏2、新增lcd见上述步骤3、这两个屏分辨率为854*480,为FWVGA,需在/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/u-boot64/include/configs里修改FWVGA和720p的顺序4、出现的错误:1)u-boot没有编译进去:按build.log先修改error,本项目出错为configs与Makefile大小写不一致2)头文件出错3)修改开机logo,分辨率不符十六、修改开机动画1、/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/1491sl_p5 _hd/power中拷取两个压缩包,压缩包里是开机连续动画图片,可以替换根据分辨率2、/home/android/gmk/test/983x_NATIVE_6_s801/device/sprd/scx35l/S801/project 对应修改密度值ro.sf.lcd_density=320 \3、/home/android/gmk/test/983x_NATIVE_6_s801/out/target/product/S801/system删除build.prop4、替换/home/android/gmk/test/983x_NATIVE_6_s801/device/sprd/scx35l/S801/thirdparty/S 801G_M506/power中的压缩包用于调用十七、出现libsepol.context_from_record: type bl229x_device is not defined错误,查找/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/device/sprd/scx35l/common/s epolicy中的file_contexts文件,改相应bl229x_device十八、设备树1、dts讲解:/hbk320/article/details/468445852、代码目录:/home/android/gmk/test/sprd9832_6.0_Rls2_W16.35.5/kernel/arch/arm/boot/dts十九、编译分支的deconfig1、=m和=y的含义:首先需要知道:obj-m = *.oobj-y = *.o上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。
Linux-2.6.24内核移植文档
Linux内核移植文档V3.0edaworld整理【Target DevBoard】Board: FS2410CPU: S3C2410XSDRAM: HY57V561620(64MB)FLASH: K9F1208(64MB)NET: CS8900【HOST PC】Linux Realse Version: Fedora Core 7 (FC7)CrossCompiler: arm-linux-gcc3.4.1 with softfloat第一部分:移植内核及NAND分区【移植步骤】1. 解压linux-2.6.24。
2. 编辑Makefile,修改目标cpu体系结构和交叉编译工具的路径。
[root @localhost linux-2.6.24]$ gedit Makefile第193行改为:ARCH ?= armCROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-CROSS_COMPILE根据自己所使用的交叉编译器路径设置。
3. 复制编译配置文件到linux-2.6.24下面。
移植过程以smdk2410开发板为模板。
[root @localhostlinux-2.6.24]$cp arch/arm/configs/s3c2410_defconfig .config4. 修改NandFlash分区信息。
[root @localhostlinux-2.6.24]$gedit arch/arm/plat-s3c24xx/common-smdk.c 第108行smdk_default_nand_part[]修改如下:static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name="BootLoader",.size=0x60000,.offset=0,},[1] = {.name="Kernel",.size=(0x200000-0x60000),.offset=0x60000,},[2] = {.name="RootFile",.size=62 * SZ_1M ,.offset=SZ_2M,// mask_flags: MTD_WRITEABLE,}};这里面修改成了三个分区,分别是bootloader,kernel和roogfilesystem分区。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.4.21 MTD驱动移植文档本文档分2个部分,第一部分是是针对读写buffer不同需要修改的代码部分及MTD 驱动程序的测试方法,第二部分是MTD 驱动的分析一:代码修改及MTD驱动测试方法1:代码修改根据JS28F256P30B95 Datesheet P5611.2 Buffered Programming一节部分的描述:The device features a 32-word buffer to enable optimum programming performance,从上面的描述可以知道JS28F256P30B95的 Buffered 是32个字,即64字节。
根据JS28F256P30BF Datesheet P278.2 Buffered Programming一节部分的描述:The device features a 512-word buffer to enable optimum programming performance.,从上面的描述可以知道JS28F256P30BF的 Buffered 是512个字,即1024字节。
根据代码分析结果来看,MTD 驱动目前不支持这么大的Buffered的大文件写操作,所以可以更改MTD驱动程序来实现JS28F256P30BF大文件的写操作。
第一个修改linux-2.4.21-rmk1/drivers/mtd/chips/cfi_cmdset_0001.c 文件中 cfi_intelext_write_buffers函数中如不部分static int cfi_intelext_write_buffers (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf){struct map_info *map = mtd->priv;struct cfi_private *cfi = map->fldrv_priv;int bufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize; ………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………. }改为static int cfi_intelext_write_buffers (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf){struct map_info *map = mtd->priv;struct cfi_private *cfi = map->fldrv_priv;int wbufsize = CFIDEV_INTERLEAVE << 6;//数值为6到9之间都可以………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………. }第二个修改地方是cfi_cmdset_0001.c文件中的do_write_buffer函数static inline int do_write_buffer(struct map_info *map, struct flchip *chip, unsigned long adr, const u_char *buf, int len){struct cfi_private *cfi = map->fldrv_priv;struct cfi_pri_intelext *extp = cfi->cmdset_priv;cfi_word status, status_OK;unsigned long cmd_adr, timeo;DECLARE_WAITQUEUE(wait, current);int wbufsize, z, suspended=0, ret=0;wbufsize = CFIDEV_INTERLEAVE << cfi->cfiq->MaxBufWriteSize; 。
}改为:static inline int do_write_buffer(struct map_info *map, struct flchip *chip, unsigned long adr, const u_char *buf, int len){struct cfi_private *cfi = map->fldrv_priv;struct cfi_pri_intelext *extp = cfi->cmdset_priv;cfi_word status, status_OK;unsigned long cmd_adr, timeo;DECLARE_WAITQUEUE(wait, current);int wbufsize, z, suspended=0, ret=0;wbufsize = CFIDEV_INTERLEAVE << 6;// 数值为6到9之间都可以。
}2:MTD驱动测试方式第一种方法:copy大文件到dev/mtdblockN,看是否有I/O error错误,如果没有说明写大文件没有问题# cp /sbin/tc /dev/mtdblock3#第二种方法:# eraseall dev/mtd3Erased 19840 Kibyte @ 0 -- 100% complete.# mount -t jffs2 /dev/mtdblock3 /cfg# cp sbin/tc cfg# ls -l /cfg-rwxr--r-- 1 root root 181220 Jan 1 08:09 tc# ls -l /sbin/tc-rwxr--r-- 1 root root 181220 May 13 2010 /sbin/tc#如果整个操作过程都没有错误信息,而/cfg下面的 TC文件的大小和/sbin下面的TC 大小一致。
则大文件的copy成功。
二:MTD 驱动的分析1:Linux MTD介绍:(网上摘录)MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。
MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。
MTD的所有源代码在/drivers/mtd子目录下。
我将CFI接口的MTD设备分为四层(从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
一、Flash硬件驱动层:硬件驱动层负责在init时驱动Flash硬件,Linux MTD设备的NOR Flash芯片驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下。
NAND型Flash的驱动程序则位于/drivers/mtd/nand子目录下二、MTD原始设备:原始设备层有两部分组成,一部分是MTD原始设备的通用代码,另一部分是各个特定的Flash的数据,例如分区。
用于描述MTD原始设备的数据结构是mtd_info,这其中定义了大量的关于MTD的数据和操作函数。
mtd_table(mtdcore.c)则是所有MTD原始设备的列表,mtd_part (mtd_part.c)是用于表示MTD原始设备分区的结构,其中包含了mtd_info,因为每一个分区都是被看成一个MTD原始设备加在mtd_table中的,mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part->master中获得。
在drivers/mtd/maps/子目录下存放的是特定的flash的数据,每一个文件都描述了一块板子上的flash。
其中调用add_mtd_device()、del_mtd_device()建立/删除mtd_info结构并将其加入/删除mtd_table(或者调用add_mtd_partition()、del_mtd_partition()(mtdpart.c)建立/删除mtd_part结构并将mtd_part.mtd_info加入/删除mtd_table 中)。
三、MTD设备层:基于MTD原始设备,linux系统可以定义出MTD的块设备(主设备号31)和字符设备(设备号90)。
MTD字符设备的定义在mtdchar.c中实现,通过注册一系列file operation函数(lseek、open、close、read、write)。
MTD块设备则是定义了一个描述MTD块设备的结构mtdblk_dev,并声明了一个名为mtdblks的指针数组,这数组中的每一个mtdblk_dev和mtd_table中的每一个mtd_info一一对应。
四、设备节点:通过mknod在/dev子目录下建立MTD字符设备节点(主设备号为90)和MTD块设备节点(主设备号为31),通过访问此设备节点即可访问MTD字符设备和块设备。
五、根文件系统:在Bootloader中将JFFS(或JFFS2)的文件系统映像jffs.image (或jffs2.img)烧到flash的某一个分区中,在/arch/arm/mach-your/arch.c 文件的your_fixup函数中将该分区作为根文件系统挂载。
六、文件系统:内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。
设备层和原始设备层的函数调用关系(红色部分需要我们实现):一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进mtd_table,mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,其中字符设备的主设备号为90,次设备号为0、2、4、6…(奇数次设备号为只读设备),块设备的主设备号为31,次设备号为0、1、2、3…设备层原始设备层NOR型Flash芯片驱动与MTD原始设备所有的NOR型Flash的驱动(探测probe)程序都放在drivers/mtd/chips下,一个MTD原始设备可以由一块或者数块相同的Flash芯片组成。