04课_移植2期驱动到 Linux3.4.2内核

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>
。。。
04课_移植2期驱动到 Linux3.4.2内核
04课_移植2期驱动到 Linux3.4.2内核
解决串口乱码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:
04课_移植2期驱动到 Linux3.4.2内核
make
修改错误:dm9dev9000c.c中
去掉头文件:
04课_移植2期驱动到 Linux3.4.2内核
包含头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改语法:
04课_移植2期驱动到 Linux3.4.2内核
去掉函数SET_MODULE_OWNER:
04课_移植2期驱动到 Linux3.4.2内核
修改私有成员使用类型:
04课_移植2期驱动到 Linux3.4.2内核
改为:
04课_移植2期驱动到 Linux3.4.2内核
修改网卡操作结构体dm9k_netdev_ops
04课_移植2期驱动到 Linux3.4.2内核
在dmfe_probe1函数中:
04课_移植2期驱动到 Linux3.4.2内核
去掉自带的dm9000_hash_table
04课_移植2期驱动到 Linux3.4.2内核
使用内核的
04课_移植2期驱动到 Linux3.4.2内核
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
04课_移植2期驱动到 Linux3.4.2内核
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
04课_移植2期驱动到 Linux3.4.2内核
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:
04课_移植2期驱动到 Linux3.4.2内核
添加/删除头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改添加/删除类下面的设备所用函数:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
添加修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改创建设备的函数:
04课_移植2期驱动到 Linux3.4.2内核
修改删除设备的函数
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改宏S3C2410_GPxx为S3C2410_GPx(x):
04课_移植2期驱动到 Linux3.4.2内核
修改触发方式的宏:
04课_移植2期驱动到 Linux3.4.2内核
修改入口函数中的函数名称:
04课_移植2期驱动到 Linux3.4.2内核
修改出口函数中卸载设备的函数:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改宏S3C2410_GPxx为S3C2410_GPx(x):
04课_移植2期驱动到 Linux3.4.2内核
修改触发方式的宏:
04课_移植2期驱动到 Linux3.4.2内核
修改入口函数中的函数名称:
04课_移植2期驱动到 Linux3.4.2内核
修改出口函数中卸载设备的函数:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改宏S3C2410_GPxx为S3C2410_GPx(x):
04课_移植2期驱动到 Linux3.4.2内核
修改触发方式的宏:
04课_移植2期驱动到 Linux3.4.2内核
修改入口函数中的函数名称:
04课_移植2期驱动到 Linux3.4.2内核
修改出口函数中卸载设备的函数:
04课_移植2期驱动到 Linux3.4.2内核

编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改宏S3C2410_GPxx为S3C2410_GPx(x):
04课_移植2期驱动到 Linux3.4.2内核
修改触发方式的宏:
04课_移植2期驱动到 Linux3.4.2内核
修改互斥锁的定义和初始化:
04课_移植2期驱动到 Linux3.4.2内核
在入口函数中初始化:
04课_移植2期驱动到 Linux3.4.2内核
修改入口函数中的函数名称:
04课_移植2期驱动到 Linux3.4.2内核
修改出口函数中卸载设备的函数:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改宏S3C2410_GPxx为S3C2410_GPx(x):
04课_移植2期驱动到 Linux3.4.2内核
修改触发方式的宏:
04课_移植2期驱动到 Linux3.4.2内核
修改互斥锁的定义和初始化:
04课_移植2期驱动到 Linux3.4.2内核
在入口函数中初始化:
04课_移植2期驱动到 Linux3.4.2内核
修改入口函数中的函数名称:
04课_移植2期驱动到 Linux3.4.2内核
修改出口函数中卸载设备的函数:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
只留下最后一个完整的驱动程序:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
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上看图案,串口也会显示一些信息
04课_移植2期驱动到 Linux3.4.2内核
echo hello > /dev/tty1 // 可以在LCD上看见hello
cat lcd.ko > /dev/fb0 // 花屏

3.2、08_buttons_input

修改Makefile:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
修改GPIO引脚引用方式:
04课_移植2期驱动到 Linux3.4.2内核
修改触边沿发方式的宏:
04课_移植2期驱动到 Linux3.4.2内核
装载:
单板: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
04课_移植2期驱动到 Linux3.4.2内核
vi etc/inittab //修改
04课_移植2期驱动到 Linux3.4.2内核
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即可看到信息:
04课_移植2期驱动到 Linux3.4.2内核

3.3、09_led_bus_drv_dev

修改Makefile:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改头文件:
04课_移植2期驱动到 Linux3.4.2内核
编译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
04课_移植2期驱动到 Linux3.4.2内核
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
04课_移植2期驱动到 Linux3.4.2内核
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:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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:
04课_移植2期驱动到 Linux3.4.2内核
修改函数名:
04课_移植2期驱动到 Linux3.4.2内核
重新编写发包函数:
04课_移植2期驱动到 Linux3.4.2内核
编译:
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

上一篇:lvm group rename


下一篇:linux加载和卸载模块