04课_移植2期驱动到 Linux3.4.2内核
文章目录
移植:
1、编译
2、解决错误
2.1、头文件不对:去掉或改名
2.2、宏不对:改名使用新宏
2.3、有些函数没有了:改名使用新函数
1、移植DM9000C网卡
1.1、尝试挂载NFS
set machid 7cF //mini2440支持网卡
mount -t nfs -o nolock,vers=2 192.168.2.16:/work/nfs_root/first_fs /mnt
1.2、分析错误
mini2440支持网卡,可以挂载成功,但是smdk2440无法挂载成功
mach-mini2440.c中支持dm9000.c的平台设备,所以它能够使用网卡;smdk2440中没有支持
mini2440已经支持了自带的dm9000,其入口函数是:
platform_driver_register(&dm9000_driver);
platform_driver dm9000_driver = {
dm9000_probe
platform_device mini2440_device_eth
platform_device *mini2440_devices[]
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
数组mini2440_devices[]被注册到内核里面了
我们使用的mach-smdk2440里面没有
/* DM9000AEP 10/100 ethernet controller */
static struct resource mini2440_dm9k_resource[] = {
[0] = {
.start = MACH_MINI2440_DM9K_BASE,
.end = MACH_MINI2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_MINI2440_DM9K_BASE + 4,
.end = MACH_MINI2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
/*
* The DM9000 has no eeprom, and it's MAC address is set by
* the bootloader before starting the kernel.
*/
static struct dm9000_plat_data mini2440_dm9k_pdata = {
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
static struct platform_device mini2440_device_eth = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
.resource = mini2440_dm9k_resource,
.dev = {
.platform_data = &mini2440_dm9k_pdata,
},
};
1.3、修改代码
所以在mach-smdk2440.c里面添加:
#include <linux/dm9000.h>
。。。
解决串口乱码arch\arm\mach-s3c24xx\mach-smdk2440.c
s3c24xx_init_clocks(16934400);
改为
s3c24xx_init_clocks(12000000);
编译内核:
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_net
uboot:
nfs 32000000 192.168.2.16:/work/nfs_root/uImage_net
set machid 16a
bootm 32000000
进入文件系统:
ifconfig eth0 192.168.2.66
mount -t nfs -o nolock,vers=2 192.168.2.16:/work/nfs_root/fs_mini_mdev_new /mnt
把之前的DM9000C驱动程序放到服务器上,
修改里面的Makefile:
make
修改错误:dm9dev9000c.c中
去掉头文件:
包含头文件:
修改语法:
去掉函数SET_MODULE_OWNER:
修改私有成员使用类型:
改为:
修改网卡操作结构体dm9k_netdev_ops
在dmfe_probe1函数中:
去掉自带的dm9000_hash_table
使用内核的
17th_dm9000c$目录,把dm9dev9000c.c放入内核目录,编译进内核:
make
cp dm9dev9000c.c /work/system/linux-3.4.2/drivers/net/ethernet/davicom/
vi /work/system/linux-3.4.2/drivers/net/ethernet/davicom/Makefile
cd /work/system/linux-3.4.2
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_net_new
1.4、重启单板,启动内核
nfs 30000000 192.168.2.16:/work/nfs_root/uImage_net_new; bootm 30000000
ifconfig eth0 192.168.2.66
ifconfig
ping 192.168.2.16 -c 3
mount -t nfs -o nolock,vers=2 192.168.2.16:/work/nfs_root/fs_mini_mdev_new /mnt
使用NFS启动内核:
reboot
set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.2.16:/work/nfs_root/fs_mini_mdev_new ip=192.168.2.55:192.168.2.16:192.168.2.1:255.255.255.0::eth0:off
nfs 30000000 192.168.2.16:/work/nfs_root/uImage_net_new; bootm 30000000
2、移植LED和按键
2.1、01_first_drv
修改Makefile:
添加/删除头文件:
修改添加/删除类下面的设备所用函数:
编译:
make
arm-linux-gcc -o firstdrvtest firstdrvtest.c
cp first_drv.ko firstdrvtest /work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod first_drv.ko
/ # ./firstdrvtest on
/ # ./firstdrvtest off
/ # rmmod first_drv
rmmod出现问题:
使用rmmod会出现 rmmod : chdir(/lib/modules): No such file or directory ?
现在内核模块在插入卸载时都会要转到 “/lib/modules/内核版本号/ ” 目录里。所以只要建立这个目录就行了。
在单板上执行:
mkdir -p /lib/modules/$(uname -r)
rmmod first_drv:即可卸载成功
2.2、02_second_drv
修改Makefile:
添加修改头文件:
修改创建设备的函数:
修改删除设备的函数
编译:
make
arm-linux-gcc -o seconddrvtest seconddrvtest.c
cp second_drv.ko firstdrvtest /work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod second_drv.ko
/ # ./seconddrvtest
/ # rmmod second_drv
2.3、03_third_drv
修改Makefile:
修改头文件:
修改宏S3C2410_GPxx为S3C2410_GPx(x):
修改触发方式的宏:
修改入口函数中的函数名称:
修改出口函数中卸载设备的函数:
编译:
make
arm-linux-gcc -o firstdrvtest firstdrvtest.c
cp first_drv.ko firstdrvtest /work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod third_drv.ko
/ # ./thirddrvtest
/ # rmmod third_drv
2.4、04_forth_drv
修改Makefile:
修改头文件:
修改宏S3C2410_GPxx为S3C2410_GPx(x):
修改触发方式的宏:
修改入口函数中的函数名称:
修改出口函数中卸载设备的函数:
编译:
make
arm-linux-gcc -o forthdrvtest forthdrvtest.c
cp forth_drv.ko forthdrvtest/work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod forth_drv.ko
/ # ./forthdrvtest
/ # rmmod forth_drv
2.5、05_fifth_drv
修改Makefile:
修改头文件:
修改宏S3C2410_GPxx为S3C2410_GPx(x):
修改触发方式的宏:
修改入口函数中的函数名称:
修改出口函数中卸载设备的函数:
编译:
make
arm-linux-gcc -o fifthdrvtest fifthdrvtest.c
cp fifth_drv.ko fifthdrvtest/work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod fifth_drv.ko
/ # ./fifthdrvtest
/ # rmmod fifth_drv
2.6、06_sixth_drv
修改Makefile:
修改头文件:
修改宏S3C2410_GPxx为S3C2410_GPx(x):
修改触发方式的宏:
修改互斥锁的定义和初始化:
在入口函数中初始化:
修改入口函数中的函数名称:
修改出口函数中卸载设备的函数:
编译:
make
arm-linux-gcc -o sixthdrvtest sixthdrvtest.c
cp sixth_drv.ko sixthdrvtest/work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod sixth_drv.ko
/ # ./sixthdrvtest
/ # rmmod sixth_drv
2.7、07_buttons_all
修改Makefile:
修改头文件:
修改宏S3C2410_GPxx为S3C2410_GPx(x):
修改触发方式的宏:
修改互斥锁的定义和初始化:
在入口函数中初始化:
修改入口函数中的函数名称:
修改出口函数中卸载设备的函数:
编译:
make
arm-linux-gcc -o buttons_test buttons_test.c
cp buttons_test /work/nfs_root/fs_mini_mdev_new/
实验:
/ # insmod buttons.ko
/ # ./buttons_test
/ # rmmod buttons
2.8、20th_chrdev_another
修改Makefile:
修改头文件:
修改函数名:
编译:
make
arm-linux-gcc -o hello_test hello_test.c
cp *.ko hello_test /work/nfs_root/fs_mini_mdev_new/
测试:
insmod hello.ko
ls dev/hello*
./hello_test /dev/hello0
./hello_test /dev/hello1
./hello_test /dev/hello2
./hello_test /dev/hello3
3、移植LCD及输入系统
3.1、10_lcd
修改Makefile:
只留下最后一个完整的驱动程序:
修改头文件:
make
cp lcd.ko /work/nfs_root/fs_mini_mdev_new/
编译内核去掉原来的lcd驱动程序:
cd /work/system/linux-3.4.2
make menuconfig
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
<M> S3C2410 LCD framebuffer support
cp arch/arm/boot/uImage /work/nfs_root/uImage_nolcd
编译模块:
make modules
cp drivers/video/cfb*.ko /work/nfs_root/fs_mini_mdev_new/
编译fb_test测试程序:
cd /work/hardware/4_zdy_graduate/04_transplant/fb_test/
make
cp fb_test /work/nfs_root/fs_mini_mdev_new
测试:
单板:nfs 30000000 192.168.2.16:/work/nfs_root/uImage_nolcd; bootm 30000000
insmod cfbcopyarea.ko
insmod cfbimgblt.ko
insmod cfbfillrect.ko
insmod lcd.ko
./fb_test /dev/fb0 // 可以在LCD上看图案,串口也会显示一些信息
echo hello > /dev/tty1 // 可以在LCD上看见hello
cat lcd.ko > /dev/fb0 // 花屏
3.2、08_buttons_input
修改Makefile:
修改头文件:
修改GPIO引脚引用方式:
修改触边沿发方式的宏:
装载:
单板:nfs 30000000 192.168.2.16:/work/nfs_root/uImage_nolcd; bootm 30000000
insmod cfbcopyarea.ko
insmod cfbimgblt.ko
insmod cfbfillrect.ko
insmod lcd.ko
insmod buttons.ko
测试:
cat dev/tty1 //LCD和串口都会显示;EINT0-2表示l和s;按键EINT11便是Enter
vi etc/inittab //修改
reboot
nfs 30000000 192.168.2.16:/work/nfs_root/uImage_nolcd; bootm 30000000
insmod cfbcopyarea.ko
insmod cfbimgblt.ko
insmod cfbfillrect.ko
insmod lcd.ko
insmod buttons.ko
在LCD上使用按键输入ls和Enter即可看到信息:
3.3、09_led_bus_drv_dev
修改Makefile:
修改函数名:
编译:
make
arm-linux-gcc -o led_test led_test.c
cp *.ko led_test /work/nfs_root/fs_mini_mdev_new/
测试:
insmod led_drv.ko
insmod led_dev.ko
./led_test on
./led_test off
3.4、11_ts
修改Makefile:
修改头文件:
编译TS驱动:
make
cp s3c_ts.ko /work/nfs_root/fs_mini_mdev_new/
编译配置内核:
make menuconfig
cp arch/arm/boot/uImage /work/nfs_root/uImage_nots
Device Drivers->Input device support->Event interface && Event debugging
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_nots
编译tslib:
tar xzf tslib-1.4.tar.gz
cd tslib
./autogen.sh
mkdir tmp
echo “ac_cv_func_malloc_0_nonnull=yes” >arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp
sudo chmod +w /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h
sudo vi /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h
cd /work/hardware/4_zdy_graduate/04_transplant/11_ts/tslib/tslib
make clean
make
make install
安装tslib:
cd tmp
cp * -rf /work/nfs_root/fs_mini_mdev_new/
使用tslib:
若使用08_buttons_input 中的insmod buttons.ko则要vi etc/inittab;添加tty1::askfirst:-/bin/sh
单板:nfs 30000000 192.168.2.16:/work/nfs_root/uImage_nots; bootm 30000000
insmod cfbcopyarea.ko
insmod cfbimgblt.ko
insmod cfbfillrect.ko
insmod lcd.ko
//insmod buttons.ko //这为08_buttons_input 中的insmod buttons.ko
insmod s3c_ts.ko
配置环境:
1.
修改 /etc/ts.conf第1行(去掉#号和第一个空格):
vi /etc/ts.conf
#module_raw input
改为:
module_raw input
2.
若使用了08_buttons_input 中的insmod buttons.ko则要vi etc/inittab;添加tty1::askfirst:-/bin/sh,配置环境时选择tevent1:
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
运行测试:
ts_calibrate
ts_test
3.5、12_usb
修改Makefile:
修改函数名:
编译:
cd /work/hardware/4_zdy_graduate/04_transplant/12_usb/
make
cp usbmouse_as_key.ko /work/nfs_root/fs_mini_mdev_new/
装载驱动:
insmod usbmouse_as_key.ko
ls dev/event*
//只有dev/event0 dev/event1
插入鼠标:
ls dev/event*
//就会出现dev/event0 dev/event1 dev/event2
按鼠标左键:LCD上显示l
按鼠标右键:LCD上显示s
按鼠标滚轮:相当于输入Enter,LCD就会显示目录里的内容
4、移植块设备和虚拟网卡
4.1、13_ramblock
修改Makefile:
修改函数名:
编译:
make
cp ramblock.ko /work/nfs_root/fs_mini_mdev_new/
测试:
insmod ramblock.ko
mkdosfs /dev/ramblock
mount -t vfat /dev/ramblock /mnt
mkdir /mnt/zdy
umount /mnt
mount -t vfat /dev/ramblock /mnt
ls /mnt
umount
mkdosfs /dev/ramblock
fdisk /dev/ramblock
m
n
p
1
1
16
n
p
2
Enter
Enter
w
ls /dev/ramblock*
4.2、14_nand
修改Makefile:
修改函数名:
编译:
make
cp s3c_nand.ko /work/nfs_root/fs_mini_mdev_new/
配置内核:
make menuconfig
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> NAND Device Support --->
< > NAND Flash support for Samsung S3C SoCs
make uImage
cp arch/arm/boot/uImage /work/nfs_root/uImage_nonand
单板:nfs 30000000 192.168.2.16:/work/nfs_root/uImage_nonand; bootm 30000000
测试:
insmod s3c_nand.ko
mount -t yaffs /dev/mtdblock3 /mnt
ls mnt/
4.3、15_nor
修改Makefile:
修改函数名:
编译:
make
cp s3c_nor.ko /work/nfs_root/fs_mini_mdev_new/
单板设置为nor启动:
nfs 30000000 192.168.2.16:/work/nfs_root/uImage_nonand; bootm 30000000
测试:
insmod s3c_nor.ko
ls dev/mtd*
4.4、16th_virt_net
修改Makefile:
修改函数名:
重新编写发包函数:
编译:
make
cp virt_net.ko /work/nfs_root/fs_mini_mdev_new/
测试:
insmod virt_net.ko
ifconfig vnet0 3.3.3.3
ifconfig
ping 3.3.3.3 -c 3
ping 3.3.3.4 -c 3