今天搞了四个驱动,终于把基本功能补全了,累死我咯

(1)移植framebuffer
drivers/video
复制samsung文件夹到cupcake内核

line236 增加
config FB_S3C
tristate "S3C Framebuffer Support"
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
depends on FB && (ARCH_S3C64XX || ARCH_S5PC1XX)

default n
---help---
TBA

choice
depends on FB_S3C
prompt "Select LCD Type"
default FB_S3C_LTE480WV
config FB_S3C_LTE480WV
bool "LTE480WV/LTP700WV"
---help---
TBA

config FB_URBETTER_INNOLUX430
bool "Urbetter INNOLUX430"
---help---
TBA

config FB_S3C_LW500
bool "LW500"
---help---
TBA

config FB_S3C_LTV350QV
bool "LTV350QV"
---help---
TBA

config FB_S3C_LTS222QV
bool "LTS222QV"
---help---
TBA

endchoice

config FB_S3C_BPP
tristate "Advanced options for S3C Framebuffer"
depends on FB_S3C
default n
---help---
TBA

choice
depends on FB_S3C_BPP
prompt "Select BPP(Bits Per Pixel)"
default FB_S3C_BPP_16
config FB_S3C_BPP_8
bool "8 BPP"
---help---
TBA

config FB_S3C_BPP_16
bool "16 BPP"
---help---
TBA

config FB_S3C_BPP_24
bool "24 BPP"
---help---
TBA

config FB_S3C_BPP_32
bool "32 BPP"
---help---
TBA
endchoice

config FB_S3C_NUM
int "Number of Framebuffers"
depends on FB_S3C_BPP && (ARCH_S3C64XX || ARCH_S5PC1XX)
default "1"
---help---
TBA

config FB_S3C_VIRTUAL_SCREEN
bool "Enable Virtual Screen"
depends on FB_S3C_BPP

default n
---help---
TBA

config FB_S3C_DOUBLE_BUFFERING
bool "Enable Double Buffering"
depends on FB_S3C_BPP

default n
---help---
TBA

修改Makefile
add
obj-$(CONFIG_FB_S3C) += samsung/

makemenuconfig
*** Frame buffer hardware drivers *** │ │
│ │ <*> S3C Framebuffer Support │ │
│ │ Select LCD Type (Urbetter INNOLUX430) ---> │ │
│ │ <*> Advanced options for S3C Framebuffer │ │
│ │ Select BPP(Bits Per Pixel) (16 BPP) ---> │ │
│ │ (1) Number of Framebuffers (NEW) │ │
│ │ [*] Enable Virtual Screen │ │
│ │ [*] Enable Double Buffering

( ) LTE480WV/LTP700WV │ │
│ │ (X) Urbetter INNOLUX430 │ │
│ │ ( ) LW500 │ │
│ │ ( ) LTV350QV │ │
│ │ ( ) LTS222QV

OK

(2)移植nand驱动
复制s3c_nand.c

修改Kconfig
config MTD_NAND_S3C
tristate "NAND Flash support for S3C SoC"
depends on ARCH_S3C64XX && MTD_NAND
help
This enables the NAND flash controller on the S3C.

No board specfic support is done by this driver, each board
must advertise a platform_device for the driver to attach.

config MTD_NAND_S3C_DEBUG
bool "S3C NAND driver debug"
depends on MTD_NAND_S3C
help
Enable debugging of the S3C NAND driver

config MTD_NAND_S3C_HWECC
bool "S3C NAND Hardware ECC"
depends on MTD_NAND_S3C
help
Enable the use of the S3C's internal ECC generator when
using NAND. Early versions of the chip have had problems with
incorrect ECC generation, and if using these, the default of
software ECC is preferable.

If you lay down a device with the hardware ECC, then you will
currently not be able to switch to software, as there is no
implementation for ECC method used by the S3C

修改makefile
obj-$(CONFIG_MTD_NAND_S3C) += s3c_nand.o


启动后

S3C NAND Driver, (c) 2008 Samsung Electronics
S3C NAND Driver is using hardware ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00080000 : "Bootloader"
0x00080000-0x00880000 : "Kernel"
0x00880000-0x08880000 : "File System"
0x08880000-0x10000000 : "User"
mice: PS/2 mouse device common for all mice
TCP cubic registered
NET: Registered protocol family 17
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)
Please append a correct "root=" boot option; here are the available partitions:
1f00 512 mtdblock0 (driver?)
1f01 8192 mtdblock1 (driver?)
1f02 131072 mtdblock2 (driver?)
1f03 122368 mtdblock3 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)

还是不能加载mtdblock2 ???

原来是没有选上yaffs2支持,重新编译内核,已经可以加载原先烧录在板子上的android0.09内核

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00080000 : "Bootloader"
0x00080000-0x00880000 : "Kernel"
0x00880000-0x08880000 : "File System"
0x08880000-0x10000000 : "User"
mice: PS/2 mouse device common for all mice
TCP cubic registered
NET: Registered protocol family 17
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
s3c-nand: ECC uncorrectable error detected
block 791 is bad
yaffs_read_super: isCheckpointed 0
VFS: Mounted root (yaffs2 filesystem).
Freeing init memory: 128K
init: HOW ARE YOU GENTLEMEN
init: reading config file
init: device init
init: mtd partition -1,
init: mtd partition 0, "Bootloade
init: mtd partition 1, "Kernel"
init: mtd partition 2, "File
init: mtd partition 3, "User"
sh: can't access tty; job control turned off
#

(3)移植触摸屏驱动
复制/drivers/input/touchscreen
s3c-ts.c

Kconfig中添加
config TOUCHSCREEN_S3C
tristate "S3C touchscreen driver"
depends on ARCH_S3C2410 || ARCH_S3C64XX || ARCH_S5PC1XX
default y
help
Say Y here to enable the driver for the touchscreen on the
S3C SMDK board.

If unsure, say N.

To compile this driver as a module, choose M here: the
module will be called s3c_ts.

config TOUCHSCREEN_NEW
bool "new flip touch"
depends on TOUCHSCREEN_S3C
default y
help
Say Y here to enable the driver for the new version touchscreen on the
S3C SMDK board.

Say N here to enable the driver for the old version touchscreen on the
S3C SMDK board.

Makefile中添加
obj-$(CONFIG_TOUCHSCREEN_S3C) += s3c-ts.o

make menuconfig中添加
--- Touchscreens │ │
│ │ <*> S3C touchscreen driver │ │
│ │ [*] new flip touch

开机提示:
S3C Touchscreen driver, (c) 2008 Samsung Electronics
S3C TouchScreen got loaded successfully : 12 bits
input: S3C TouchScreen as /class/input/input0

测试OK

(4)移植DM9000网卡驱动,这是最痛苦的部分!因为2.6.29内核没有做,得从开发板提供的2.6.24内核中移植,但是开发板这一块写的很不标准,用了很多24xx的头文件,导致移植非常痛苦。

1)这是正确的加载内容,参考
dm9000 Ethernet Driver
eth%d: con201 Invalid ethernet MAC address. using default config, Please set using ifconfig
eth0: dm9000 at f7200300,f7200304 IRQ 71 MAC: 00:e0:4a:bc:15:e7

2)从开发板提供的2.6.24内核中将dm9000_con201.c提出,编译,发现问题

CHK include/linux/compile.h
CC drivers/net/dm9000_con201.o
drivers/net/dm9000_con201.c:74:31: error: asm/arch/regs-irq.h: No such file or directory
drivers/net/dm9000_con201.c:75:31: error: asm/arch/regs-mem.h: No such file or directory
drivers/net/dm9000_con201.c:76:32: error: asm/arch/regs-gpio.h: No such file or directory
drivers/net/dm9000_con201.c: In function 'dm9000_probe':
drivers/net/dm9000_con201.c:417: error: 'S3C_SROM_BW' undeclared (first use in this function)
drivers/net/dm9000_con201.c:417: error: (Each undeclared identifier is reported only once
drivers/net/dm9000_con201.c:417: error: for each function it appears in.)
drivers/net/dm9000_con201.c:422: error: 'S3C_SROM_BC1' undeclared (first use in this function)
drivers/net/dm9000_con201.c:425: error: 'S3C_GPNCON' undeclared (first use in this function)
drivers/net/dm9000_con201.c:426: error: 'S3C_GPNPU' undeclared (first use in this function)
drivers/net/dm9000_con201.c:428: error: 'S3C_EINT0CON0' undeclared (first use in this function)
drivers/net/dm9000_con201.c:430: error: 'S3C_EINTFLTCON0' undeclared (first use in this function)
drivers/net/dm9000_con201.c:432: error: 'S3C_EINTPEND' undeclared (first use in this function)
drivers/net/dm9000_con201.c:433: error: 'S3C_EINT0MASK' undeclared (first use in this function)
make[2]: *** [drivers/net/dm9000_con201.o] 错误 1
make[1]: *** [drivers/net] 错误 2
make: *** [drivers] 错误 2
[kyon@SEP4020 kernel-6410]$

需要这3个头文件
drivers/net/dm9000_con201.c:74:31: error: asm/arch/regs-irq.h: No such file or directory
drivers/net/dm9000_con201.c:75:31: error: asm/arch/regs-mem.h: No such file or directory
drivers/net/dm9000_con201.c:76:32: error: asm/arch/regs-gpio.h: No such file or directory

3)继续出现问题

CHK include/linux/compile.h
CC drivers/net/dm9000_con201.o
drivers/net/dm9000_con201.c: In function 'dm9000_probe':
drivers/net/dm9000_con201.c:419: error: 'S3C24XX_VA_SROMC' undeclared (first use in this function)
drivers/net/dm9000_con201.c:419: error: (Each undeclared identifier is reported only once
drivers/net/dm9000_con201.c:419: error: for each function it appears in.)
drivers/net/dm9000_con201.c:427: error: 'S3C24XX_VA_GPIO' undeclared (first use in this function)
make[2]: *** [drivers/net/dm9000_con201.o] 错误 1
make[1]: *** [drivers/net] 错误 2
make: *** [drivers] 错误 2
[kyon@SEP4020 kernel-6410]$

这里有问题,经过测试要添加如下内容
//add by kyon
#define S3C24XX_VA_SROMC S3C_VA_SROMC
#define S3C24XX_VA_GPIO S3C64XX_VA_GPIO//S3C_VA_GPIO
//add end


4)发现需要在arch/arm中添加启动信息
plat-smdk64xx目录的dev.
c
//add by kyon
#include <linux/dm9000.h>

#define S3C_VA_DM9000nc1 S3C_ADDR(0x03200300)
#define S3C24XX_VA_DM9000CS1 S3C_VA_DM9000nc1
#define S3C24XX_SZ_DM9000CS1 SZ_1M

#define DM9000_ETH_IRQ_EINT0 S3C_EINT(7)//IRQ_EINT7 //这儿要注意!原来的IRQ_EINT7一定要改掉!

static struct resource dm9000_resources_cs1[] = {
[0] = {
.start = S3C24XX_VA_DM9000CS1,
.end = (S3C24XX_VA_DM9000CS1+ S3C24XX_SZ_DM9000CS1),
.flags = IORESOURCE_MEM,
},
[1] = {
.start = (DM9000_ETH_IRQ_EINT0),
.end = (DM9000_ETH_IRQ_EINT0),
.flags = IORESOURCE_IRQ,
},
};

static struct dm9000_plat_data dm9000_setup_cs1 = {
.flags = DM9000_PLATF_16BITONLY
};

struct platform_device s3c_device_dm9000_cs1 = {
.name = "dm9000_con201",
.id = 0,
.num_resources = ARRAY_SIZE(dm9000_resources_cs1),
.resource = dm9000_resources_cs1,
.dev = {
.platform_data = &dm9000_setup_cs1,
}
};

EXPORT_SYMBOL(s3c_device_dm9000_cs1);


还要修改文件mach-smdk6410.c
一些定义,又重复定义了,应该放在一个通用的头文件中
//kyon
extern struct platform_device s3c_device_dm9000_cs1;

#define S3C_VA_DM9000nc1 S3C_ADDR(0x03200300)

#define S3C24XX_VA_DM9000CS1 S3C_VA_DM9000nc1
#define S3C6400_PA_DM9000CS1 (0x18000300)
#define S3C24XX_SZ_DM9000CS1 SZ_1M


在启动结构体中添加
static struct platform_device *smdk6410_devices[] __initdata =
&s3c_device_dm9000_cs1,


还要添加地址映射:
static struct map_desc smdk6410_iodesc[] __initdata = {
{
.virtual = (u32)S3C24XX_VA_DM9000CS1,
.pfn = __phys_to_pfn(S3C6400_PA_DM9000CS1),
.length = S3C24XX_SZ_DM9000CS1,
.type = MT_DEVICE,
},
};


前面没进行地址映射,开机不断内核崩溃,做到这里终于不内核内核崩溃

dm9000 Ethernet Driver
dm9000: dm9000_probe()dm9000: dm9000x: resetting
eth%d: con201 Invalid ethernet MAC address. using default config, Please set using ifconfig
eth0: dm9000 at f7200300,f7200304 IRQ 71 MAC: 00:e0:4a:bc:15:e7

可惜还是不能挂载NFS
dm9000: entering dm9000_open
IP-Config: Failed to open eth0
IP-Config: No network devices available.
VFS: Cannot open root device "nfs" or unknown-block(0,255)

最后正确的配置中断号,网卡终于通了!
dm9000 Ethernet Driver
eth%d: con201 Invalid ethernet MAC address. using default config, Please set using ifconfig
eth0: dm9000 at f7200300,f7200304 IRQ 108 MAC: 00:e0:4a:bc:15:e7


dm9000 Ethernet Driver
eth%d: con201 Invalid ethernet MAC address. using default config, Please set using ifconfig
eth0: dm9000 at f7200300,f7200304 IRQ 108 MAC: 00:e0:4a:bc:15:e7
Driver 'sd' needs updating - please use bus_type methods
S3C NAND Driver, (c) 2008 Samsung Electronics
S3C NAND Driver is using hardware ECC.
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00080000 : "Bootloader"
0x00080000-0x00880000 : "Kernel"
0x00880000-0x08880000 : "File System"
0x08880000-0x10000000 : "User"
mice: PS/2 mouse device common for all mice
S3C Touchscreen driver, (c) 2008 Samsung Electronics
S3C TouchScreen got loaded successfully : 12 bits
input: S3C TouchScreen as /class/input/input0
TCP cubic registered
NET: Registered protocol family 17
NET: Registered protocol family 15
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 136K
init started: BusyBox v1.10.4 (2009-05-18 19:40:33 CST)
starting pid 236, tty '': '/etc/init.d/rcS'

**********************************************
SEP4020 ARM Linux-2.6.16(VERSION4.0)
busybox1.10.4
**********************************************
# mount all...........
# Starting mdev.........
starting pid 244, tty '': '-/bin/sh'
/ # ifconfig eth0 192.168.0.4
eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
/ # ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1): 56 data bytes
64 bytes from 192.168.0.1: seq=0 ttl=128 time=6.160 ms
64 bytes from 192.168.0.1: seq=1 ttl=128 time=0.348 ms
64 bytes from 192.168.0.1: seq=2 ttl=128 time=0.344 ms
64 bytes from 192.168.0.1: seq=3 ttl=128 time=0.349 ms
64 bytes from 192.168.0.1: seq=4 ttl=128 time=0.338 ms
64 bytes from 192.168.0.1: seq=5 ttl=128 time=0.345 ms
64 bytes from 192.168.0.1: seq=6 ttl=128 time=0.305 ms

最后发现挂载NFS时有问题

drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Gateway not on directly connected network.
Looking up port of RPC 100003/2 on 192.168.0.3
Looking up port of RPC 100005/1 on 192.168.0.3
VFS: Mounted root (nfs filesystem).
Freeing init memory: 136K
status check failed: 250
nfs: server 192.168.0.3 not responding, still trying
nfs: server 192.168.0.3 not responding, still trying
nfs: server 192.168.0.3 not responding, still trying
nfs: server 192.168.0.3 not responding, still trying

但是打开debug输出printk却可以正常加载,难道什么地方时序不太对?

排查这句话status check failed: 250
发现果然又在dm9000_rx(struct net_device *dev)函数里面

看来rx函数还有有不少问题

ior(db, DM9000_MRCMDX); /* Dummy read */


/* Get most updated data */
rxbyte = readb(db->io_data);

/* Status check: this byte must be 0 or 1 */
if (rxbyte > DM9000_PKT_RDY) {
printk("status check failed: %d/n", rxbyte);
iow(db, DM9000_RCR, 0x00); /* Stop Device */
iow(db, DM9000_ISR, IMR_PAR); /* Stop INT request */
return;
}

读rxbyte时出问题,看前面有一次dummy read,于是又加了一次dummy read,竟然就过去了。。

eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Gateway not on directly connected network.
Looking up port of RPC 100003/2 on 192.168.0.3
Looking up port of RPC 100005/1 on 192.168.0.3
VFS: Mounted root (nfs filesystem).
Freeing init memory: 136K
init started: BusyBox v1.10.4 (2009-05-18 19:40:33 CST)
starting pid 237, tty '': '/etc/init.d/rcS'

**********************************************
SEP4020 ARM Linux-2.6.16 SDK 3.1
**********************************************
# mount all...........
# Starting mdev.........
starting pid 244, tty '': '-/bin/sh'
/ #

下面可以找cupcake的文件系统试试了!


来自: http://hi.baidu.com/aokikyon/blog/item/8ca56643a902f8189213c6f3.html

更多相关文章

  1. Android 内核编绎错误解决方案
  2. Android Widget 中ListView加载网络图片
  3. eclipse添加android插件错误处理方法
  4. android 加载图片
  5. Android Custom Dialog错误Unable to add window -- token null
  6. 【android】android 开发错误集锦4月
  7. 详解Android获取系统内核版本的方法与实现代码

随机推荐

  1. android 布局学习
  2. Android界面——LinearLayout和RelativeL
  3. android 几个常用命令
  4. 通过xml加载菜单Menus
  5. Android(安卓)源代码结构
  6. Android(安卓)imageView图片按比例缩放
  7. android Wifi自动连接
  8. Android系统自带主题样式(android:theme),An
  9. Android发展史
  10. Android内核源码交叉编译