如何移植Linux VGA驱动? (linux vga驱动移植)

如何移植Linux VGA驱动?

随着计算机产业的快速发展,Linux操作系统已经成为了一款广泛应用的开源操作系统。而VGA驱动则是Linux操作系统中非常重要的一个组成部分,它是Linux操作系统图形界面显示的基本支撑。但是,在某些特定场合下,我们可能需要移植Linux VGA驱动,这就需要我们具备一定的技术功底和操作经验。

本文将为大家介绍如何移植Linux VGA驱动,帮助大家更好地应对相关问题。

一、什么是Linux VGA驱动

Linux VGA驱动是Linux操作系统图形界面的基础支撑,它是控制计算机图形界面硬件设备的程序,是连接操作系统内核和硬件的桥梁,是计算机图形显示技术不可或缺的重要组成部分。

二、为什么需要移植Linux VGA驱动

在使用Linux操作系统时,有些硬件设备可能无法使用官方驱动程序,因此需要移植适用于自己硬件设备的驱动程序。同时,开发者在开发硬件之前也需要移植驱动程序以确保硬件的兼容性。

三、Linux VGA驱动的移植方法

1. 确认硬件设备的主要参数

在进行移植前,需要先确定硬件设备的基本参数,如分辨率、色深等,以及设备的型号、厂商等基本信息,这将有助于我们在移植过程中进行正确的配置和测试。

2. 获取源代码

获取适用于自己硬件设备的源代码,这可以通过下载开源驱动程序或从Linux内核的源代码库中获取,确保版本兼容性。同时,为了方便排查问题,建议将源代码存储在本地磁盘上,并备份代码。

3. 配置源代码

根据硬件设备的基本参数配置源代码,这需要了解有关Linux内核的一些基本原理和知识。这一步中,需要修改Makefile文件和源代码文件,以确保驱动程序可以正确地编译和链接。

4. 编译和链接

对修改后的源代码进行编译和链接。编译和链接的目的是将源代码翻译成可执行的二进制文件,并将二进制文件与内核链接。这一步骤对编译环境要求比较高,确保正确配置好编译环境,并在编译过程中注意排查错误。

5. 安装驱动程序

将编译链接后的驱动程序安装到系统中,以使得Linux操作系统可以识别这个硬件设备。安装驱动程序需要运行命令,具体命令受使用的Linux操作系统版本和驱动程序类型的影响,可以查询相关文档进行确认。

6. 测试驱动程序

在安装完成后,需要对驱动程序进行测试。测试可以分为功能测试、性能测试和稳定性测试三个方面。功能测试主要测试硬件设备是否可以正常工作,性能测试主要测试硬件性能和Linux操作系统的兼容性,稳定性测试主要测试长时间运行后硬件设备和Linux操作系统是否能够稳定工作。测试的目的是找出驱动程序的不足之处并加以改进,确保Linux VGA驱动程序的运行稳定和兼容性。

四、

Linux VGA驱动程序的移植是一个比较复杂的工程,需要掌握相关的知识和技术。本文介绍了如何移植Linux VGA驱动程序,希望能够帮助大家在运用Linux操作系统时更好地应对相关问题。

相关问题拓展阅读:

  • linux内核移植,DM9000网卡驱动的移植,ARM开发板和电脑之间无法ping通,不知道什么原因,有人能解决吗?
  • 如何将linux2.6.38内核移植到TQ2440

linux内核移植,DM9000网卡驱动的移植,ARM开发板和电脑之间无法ping通,不知道什么原因,有人能解决吗?

1、检查开发板网口灯是否亮。

2、检查你的PC机IP地址是否和开发板在同一网段(192.168.1.x)晌肢。

3、开发板上ping自己一下。

4、检查开发板系统日志有没有错误(dmesg)。

更大的可能就是早派2的情陆谨贺况,你看一下。

不在同一个网段 把你的开发板IP设置为192.168.0.100

如何将linux2.6.38内核移植到TQ2440

移植步骤:

1.修改根目录的Makefile中的ARCH=arm,CROSS-COMPILE=arm-linux-

2.在arch/arm/mach-s3c2440/mach-dk2440.c中,将163行的s3c24xx_init_clocks()改为s3c24xx_init_clocks()。

3.修改arch/arm/tools/mach-types中379行的362改为168,因为uboot中定义的机器码是168.

4.修改arch/州橡arm/boot/中的Makefile文件,在58行添加@cp -f arch/arm/boot/zImage zImage.bin,实现把生成的zImage文件册伏旁复制到内核源码根目录下。

5.在根目录的Makefile的1164行添加rm -f zImage.bin,使得在执行make distclean在清除产生的文件的同时,把内核根目录下的zImage也清除。

6.修改arch/arm/plat-s3c24xx/common-dk.c中111行的static struct mtd_partition dk_default_nand_part的nandflash分区为:

= {

.name = “Andy_uboot”,

.offset = 0x,

.size = 0x,

},

= {

.name = “Andy_kernel”,

.offset = 0x,

.size = 0x,

},

= {

.name = “Andy_yaffs2”,

.offset = 0x,

.size = 0x0FB80000,

}

7.修改drivers/mtd/nand/s3c2410.c中的839行为chip->ecc.mode=NAND_ECC_NONE;

8.修改arch/arm/mach-s3c2440/mach-dk2440.c中100行为.ulcon = 0x03。

9.在drivers/serial/samsung.c的51行添加

#include

#include

在433行添加:

if (port->line == 2) {

s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);

s3c2410_gpio_pullup(S3C2410_GPH(6), 1);

s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);

s3c2410_gpio_pullup(S3C2410_GPH(7), 1);

}

10.用git工具下载最新的yaffs2源代码。

具体为在终端输入git clone

www.aleph1.co.uk/yaffs2

下载最新的yaffs2,下

载完成给内核打补丁,进入yaffs目录,执行

./patch-kernel.sh c m opt/Andy/linux-2.6.38(以自己的内核目录为准),其中的c代表复厅瞎制,m代表复合类型。

11.用make menuconfig配置linux内核。

12.执行make zImage,将生成的zImage.bin下载到TQ2440。

13.制作文件系统。

解压busybox-1.18.4.tar.bz2,修改busybox-1.18.4中的Makefile,在164行和190行分别修改为CROSS-COMPILE=arm-linux-和ARCH=arm。执行make,然后在执行make install。将生成_install复制到根目录,添加文件系统文件,用天嵌提供的mkyaffs2image生成root.bin的可执行文件,下载到开发板。

14.启动开发板,打印信息如下:

Start Linux …

Copy linux kernel from 0xto 0x, size = 0x… Copy Kernel to SDRAM done,NOW, Booting Linux……

Uncompressing Linux… done, booting the kernel.

Linux version 2.6.38-Andy (root@Andy) (gcc version 4.3.3 (Sourcery G++ Lite 2023q1-176) ) #15 Fri Apr 8 20:21:42 CST 2023

CPU: ARM920T revision 0 (ARMv4T), cr=c

CPU: VIVT data cache, VIVT instruction cache

Machine: Andy’s TQ2440 development board!

ATAG_INITRD is deprecated; please update your bootloader.

Memory policy: ECC disabled, Data cache writeback

CPU S3C2440A (id 0x)

S3C24XX Clocks, Copyright 2023 Simtec Electronics

S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256

Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

PID hash table entries: 256 (order: -2, 1024 bytes)

Dentry cache hash table entries: 8192 (order: 3,bytes)

Inode-cache hash table entries: 4096 (order: 2,bytes)

Memory: 64MB = 64MB total

Memory: 60896k/60896k available, 4640k reserved, 0K highmem

Virtual kernel memory layout:

vector : 0xffffxffff( 4 kB)

fixmap : 0xfffxfffe( 896 kB)

DMA : 0xffcxffe( 2 MB)

vmalloc : 0xcxf( 792 MB)

lowmem : 0xcxc( 64 MB)

modules : 0xbfxc( 16 MB)

.init : 0xcxc( 116 kB)

.text : 0xcxc(3536 kB)

.data : 0xc039axc03bac40 ( 132 kB)

SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1

NR_IRQS:85

irq: clearing pending ext status

irq: clearing subpending status

irq: clearing subpending status

Console: colour dummy device 80×30

console enabled

Calibrating delay loop… 199.47 BogoMIPS (lpj=498688)

pid_max: default:minimum: 301

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

gpiochip_add: gpios 288..303 (GPIOK) failed to register

gpiochip_add: gpios 320..334 (GPIOL) failed to register

gpiochip_add: gpios 352..353 (GPIOM) failed to register

NET: Registered protocol family 16

S3C2440: Initialising architecture

S3C2440: IRQ Support

S3C24XX DMA Driver, CopyrightSimtec Electronics

DMA channel 0 at c, irq 33

DMA channel 1 at c, irq 34

DMA channel 2 at c, irq 35

DMA channel 3 at c48080c0, irq 36

S3C244X: Clock Support, DVS off

bio: create slab at 0

SCSI subsystem initialized

ucore: registered new interface driver ufs

ucore: registered new interface driver hub

ucore: registered new device driver u

s3c-i2c s3c2440-i2c: slave address 0x10

s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz

s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter

Advanced Linux Sound Architecture Driver Version 1.0.23.

cfg80211: Calling CRDA to update world regulatory domain

NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes)

TCP established hash table entries: 2023 (order: 2,bytes)

TCP bind hash table entries: 2023 (order: 1, 8192 bytes)

TCP: Hash tables configured (established 2023 bind 2023)

TCP reno registered

UDP hash table entries: 256 (order: 0, 4096 bytes)

UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)

NET: Registered protocol family 1

RPC: Registered udp transport module.

RPC: Registered tcp transport module.

RPC: Registered tcp NFSv4.1 backchannel transport module.

msgmni has been set to 118

io scheduler noop registered (default)

s3c2440-uart.0: ttySAC0 at MMIO 0x(irq = 70) is a S3C2440

s3c2440-uart.1: ttySAC1 at MMIO 0x(irq = 73) is a S3C2440

s3c2440-uart.2: ttySAC2 at MMIO 0x(irq = 76) is a S3C2440

loop: module loaded

S3C24XX NAND Driver, (c) 2023 Simtec Electronics

s3c24xx-nand s3c2440-nand: Tacls=2, 20ns Twrph0=6 60ns, Twrph1=2 20ns

s3c24xx-nand s3c2440-nand: NAND ECC disabled

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)

NAND_ECC_NONE selected by board driver. This is not recommended !!

Scanning device for bad blocks

Bad eraseblock 62 at 0xc0000

Bad eraseblock 1435 at 0x00000b360000

cmdlinepart partition parsing not available

Creating 3 MTD partitions on “NAND”:

0xx: “Andy_uboot”

0xx: “Andy_kernel”

0xx00000ff80000 : “Andy_yaffs2”

dm9000 Ethernet Driver, V1.31

Now use the default MAC address: 10:23:45:67:89:ab

eth0: dm9000e at c,cIRQ 51 MAC: 10:23:45:67:89:ab (EmbedSky)

ohci_hcd: USB 1.1 ‘Open’ Host Controller (OHCI) Driver

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x

u u1: New USB device found, idVendor=1d6b, idProduct=0001

u u1: New USB device strings: Mfr=3, Product=2, SerialNumber=1

u u1: Product: S3C24XX OHCI

u u1: Manufacturer: Linux 2.6.38-Andy ohci_hcd

u u1: SerialNumber: s3c24xx

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 2 ports detected

Initializing USB Mass Storage driver…

ucore: registered new interface driver u-storage

USB Mass Storage support registered.

ucore: registered new interface driver userial

userial: USB Serial Driver core

USB Serial support registered for pl2303

ucore: registered new interface driver pl2303

pl2303: Prolific PL2303 USB to serial adaptor driver

s3c2410_udc: debugfs dir creation failed -19

mousedev: PS/2 mouse device common for all mice

S3C24XX RTC, (c) 2023,2023 Simtec Electronics

s3c-rtc s3c2410-rtc: rtc disabled, re-enabling

s3c-rtc s3c2410-rtc: rtc core: registered s3c as rtc0

i2c /dev entries driver

S3C2410 Watchdog Timer, (c) 2023 Simtec Electronics

s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled

ucore: registered new interface driver uhid

uhid: USB HID core driver

ALSA device list:

No soundcards found.

TCP cubic registered

lib80211: common routines for IEEE802.11 drivers

s3c-rtc s3c2410-rtc: setting system clock to:47:19 UTC ()

yaffs: dev isname is “mtdblock2” rw

yaffs: passed flags “”

VFS: Mounted root (yaffs filesystem) on device 31:2.

Freeing init memory: 116K

Please press Enter to activate this console.

移植过程中产生的问题及其解决方法将在下一节说明。还有一些驱动没有移植。继续努力!

在移植linux2.6.38过程中,遇见了很多的问题,通过在网上查阅相关信息和在图书馆不停的查阅资料,终于成功了。下面将移植过程中产生的问题及其解放方法与大家共享一下。

1、编译内核时yaffs2出现unknown field ‘clear_inode’ specified in initializer的

错误,原因是所下载的yaffs2不支持linux2.6.38.

解决方法:最新的yaffs2采用git发布,所以采用git工具下载最新的yaffs2源代码。

具体为在终端输入git clone

www.aleph1.co.uk/yaffs2

下载最新的yaffs2,下

载完成给内核打补丁,进入yaffs目录,执行

./patch-ker.sh c m opt/Andy/linux-2.6.38(以自己的内核目录为准),其中的c代表复制,m代表复合类型。

2、移植linux内核到开发板后,出现data abort的错误,错误原因为内核大小超过了2M,

天嵌的Uboot只分配给内核2M的空间,所以报错。

解决方法:精简内核,使其小于2M。或者修改Uboot,是内核大小大于2M。

所以个人认为天嵌的Uboot值得改进,下一步我将移植Uboot,用自己的Uboot就不存在这个问题了。嘿嘿

3.移植内核时,出现Uncompressing Linux… done, booting the kernel后,系统不能启动,网上好多人说是因为在menuconfig选项中的Boot options中的Default kernel command string中没有设置noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 rootfs=yaffs2 rw。其实不用设置这个参数也可以,我采用在内核配置文件中将Kernel Feature/Provide old way to pass kernel parameters选上就行了,因为天嵌用的bootloader太老了,从打印的内核信息中就可以看出。(ATAG_INITRD is deprecated; please update your bootloader.)

4.内核启动时,出现Failed to execute /linuxrc的错误,原因是:

(1)文件系统中没有包含linuxrc的可执行文件。在文件系统中添加linuxrc就可完成linux的启动。

(2)在/driver/mtd/nand/s3c2410.c中将chip->ecc.mode = NAND_ECC_SOFT;改为chip->ecc.mode = NAND_ECC_NONE;并在配置内核中将Samsung S3C NAND Hardware ECC选项删掉。

这个问题纠结了我好久,我遇见这个问题后,先尝试用nfs挂载,能够挂载上,所以我确定肯定是nandflash出了问题了,以为nandflash坏了(因为被我不停的擦写,嘿嘿),后来用天嵌自带的镜像试了是好的,我就明白了,估计是我的nand驱动有问题了,仔细检查驱动,发现内核配置中的Samsung S3C NAND Hardware ECC没有去掉,,一个小小的问题折磨了我这么久。所以一定一定要仔细啊。

5.编译串口驱动是出现error: implicit declaration of function ‘s3c2410_gpio_cfgpin’的错误,是因为内核版本2.6.38的内核定义s3c2410_gpio_cfgpin是在linux/gpio.h中,所以添加#include 后即可。

6.编译串口驱动是出现error: ‘S3C2410_GPH6’ undeclared (first use in this function)是因为在内核版本2.6.38的内核定义s3c2410_gpio_cfgpin的函数变量采用的是S3C2410_GPH(6),而非S3C2410_GPH6,将其改为S3C2410_GPH(6)即可解决问题。

7.linux内核2.6.38的串口程序samsung.c在/driver/tty/serial中。这里与原来的内核版本不一致。这个要注意,内核版本改了,接口也改了,我当时找不到samsung.c,然后通过find命令一看,晕,原来在这里面。

关于linux vga驱动移植的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《如何移植Linux VGA驱动? (linux vga驱动移植)》
文章链接:https://zhuji.vsping.com/52155.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。