我用纯净的3.0.8对照友善提供的3.0.8移植LCD驱动
首先添加多媒体设备空间,在arch/arm/mach-s5pv210/mach-smdkv210.c
/* Multimedia support */
#define LCD_WIDTH 800
#define LCD_HEIGHT 480
#define BYTES_PER_PIXEL 4
#define NUM_BUFFER_OVLY \
(CONFIG_FB_S3C_NUM_OVLY_WIN * CONFIG_FB_S3C_NUM_BUF_OVLY_WIN)
#define NUM_BUFFER \
(CONFIG_FB_S3C_NR_BUFFERS + NUM_BUFFER_OVLY)
#define PXL2FIMD(pixels) \
((pixels) * BYTES_PER_PIXEL * NUM_BUFFER)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC0 ( 6144 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC1 ( 16 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC2 ( 6144 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC0 (36864 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC1 (36864 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD PXL2FIMD(LCD_WIDTH * LCD_HEIGHT)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_JPEG ( 8192 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_G2D ( 8192 * SZ_1K)
#define S5PV210_VIDEO_SAMSUNG_MEMSIZE_TEXSTREAM ( 4096 * SZ_1K)
#define S5PV210_ANDROID_PMEM_MEMSIZE_PMEM ( 5550 * SZ_1K)
#define S5PV210_ANDROID_PMEM_MEMSIZE_PMEM_GPU1 ( 1800 * SZ_1K) //3300
#define S5PV210_ANDROID_PMEM_MEMSIZE_PMEM_ADSP ( 1500 * SZ_1K)
static struct s5p_media_device mini210_media_devs[] = {
#if 1 //defined(CONFIG_VIDEO_MFC50)
{
.id = S5P_MDEV_MFC,
.name = "mfc",
.bank = 0,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC0,
.paddr = 0,
},
{
.id = S5P_MDEV_MFC,
.name = "mfc",
.bank = 1,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_MFC1,
.paddr = 0,
},
#endif
#if 1 //defined(CONFIG_VIDEO_FIMC)
{
.id = S5P_MDEV_FIMC0,
.name = "fimc0",
.bank = 1,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC0,
.paddr = 0,
},
{
.id = S5P_MDEV_FIMC1,
.name = "fimc1",
.bank = 1,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC1,
.paddr = 0,
},
{
.id = S5P_MDEV_FIMC2,
.name = "fimc2",
.bank = 1,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMC2,
.paddr = 0,
},
#endif
#if 1 //defined(CONFIG_VIDEO_JPEG_V2)
{
.id = S5P_MDEV_JPEG,
.name = "jpeg",
.bank = 0,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_JPEG,
.paddr = 0,
},
#endif
{
.id = S5P_MDEV_FIMD,
.name = "fimd",
.bank = 1,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD,
.paddr = 0,
},
#if 1 //defined(CONFIG_VIDEO_G2D)
{
.id = S5P_MDEV_G2D,
.name = "g2d",
.bank = 0,
.memsize = S5PV210_VIDEO_SAMSUNG_MEMSIZE_G2D,
.paddr = 0,
},
#endif
#if defined(CONFIG_ANDROID_PMEM)
{
.id = S5P_MDEV_PMEM_GPU1,
.name = "pmem_gpu1",
.bank = 0, /* OneDRAM */
.memsize = S5PV210_ANDROID_PMEM_MEMSIZE_PMEM_GPU1,
.paddr = 0,
},
#endif
};
接着在static void __init smdkv210_map_io(void)函数中加入
frame_size = lcd->width * lcd->height * BYTES_PER_PIXEL;
fimd_size = ALIGN(frame_size, PAGE_SIZE) * NUM_BUFFER;
if (frame_size > 0x200000) {
fimd_size += ALIGN(frame_size, PAGE_SIZE) * 2;
printk("frame_size > 0x200000");
}
/* Reserve 0x003f6000 bytes for PVR YUV video, and 1 page */
fimd_size += ALIGN(1280*720, PAGE_SIZE) * 3;
fimd_size += ALIGN(1280*360, PAGE_SIZE) * 3 + PAGE_SIZE;
if (fimd_size != S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD) {
mini210_fixup_bootmem(S5P_MDEV_FIMD, fimd_size);
printk("fimd_size != S5PV210_VIDEO_SAMSUNG_MEMSIZE_FIMD");
}
s5p_reserve_bootmem(mini210_media_devs,
ARRAY_SIZE(mini210_media_devs), S5P_RANGE_MFC);
}
s5p_reserve_bootmem函数在/arch/arm/plat-s5p/bootmem.c中实现
函数中通过
start = meminfo.bank[mdev->bank].start;
end = start + meminfo.bank[mdev->bank].size;
添加多媒体设备的地址。
但是在系统启动时,出现如下信息
s5p: 36864 kbytes system memory reserved for mfc at 0x2dc00000, 0-bank base(0x2dc00000)
s5p: 36864 kbytes system memory reserved for mfc at 0x3dbf6000, 1-bank base(0x3dbf6000)
s5p: 6144 kbytes system memory reserved for fimc0 at 0x3d5f6000, 1-bank base(0x3d5f6000)
s5p: 16 kbytes system memory reserved for fimc1 at 0x3d5f2000, 1-bank base(0x3d5f2000)
s5p: 6144 kbytes system memory reserved for fimc2 at 0x3cff2000, 1-bank base(0x3cff2000)
s5p: 8192 kbytes system memory reserved for jpeg at 0x2d400000, 0-bank base(0x2d400000)
s5p: 13060 kbytes system memory reserved for fimd at 0x3c331000, 1-bank base(0x3c331000)
s5p: 8192 kbytes system memory reserved for g2d at 0x2cc00000, 0-bank base(0x2cc00000)
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 101179
对照友善提供的3.0.8内核输出信息
[ 0.000000] s5p: 36864 kbytes system memory reserved for mfc at 0x2dc00000, 0-bank base(0x2dc00000)
[ 0.000000] s5p: 36864 kbytes system memory reserved for mfc at 0x3dbf5000, 1-bank base(0x3dbf5000)
[ 0.000000] s5p: 6144 kbytes system memory reserved for fimc0 at 0x3d5f5000, 1-bank base(0x3d5f5000)
[ 0.000000] s5p: 16 kbytes system memory reserved for fimc1 at 0x3d5f1000, 1-bank base(0x3d5f1000)
[ 0.000000] s5p: 6144 kbytes system memory reserved for fimc2 at 0x3cff1000, 1-bank base(0x3cff1000)
[ 0.000000] s5p: 8192 kbytes system memory reserved for jpeg at 0x2d400000, 0-bank base(0x2d400000)
[ 0.000000] s5p: 13060 kbytes system memory reserved for fimd at 0x3c330000, 1-bank base(0x3c330000)
[ 0.000000] s5p: 8192 kbytes system memory reserved for g2d at 0x2cc00000, 0-bank base(0x2cc00000)
为何地址会有偏差,百思不得其解,求助各位高手