步骤1:搭建TFTP和NFS环境(见前实验)
步骤2:共享。
将 D:\资料\华清远见\cortexA8资料\实验资料\3. Linux操作系统移植部分\移植全新的Linux3.2内核到开发平台\1 Linux内核编译实验\移植好的内核 下的 linux-3.2-FS210-V3.tar.bz2 复制到共享目录下。
将 D:\资料\华清远见\cortexA8资料\实验资料 复制到共享目录下。
步骤3:建立目录
cd workdir
mkdir driver
cd driver
cp /mnt/hgfs/share/3.\ Linux操作系统移植部分/移植全新的Linux3.2内核到开发平台/1\ Linux内核编译实验/移植好的内核/linux-3.2-FS210-V3.tar.bz2 ./ -a
cp /mnt/hgfs/share/4.\ Linux驱动部分/Linux3.2Drivers/ ./ -a
步骤3:解压
tar -xvf linux-3.2-FS210-V3.tar.bz2
步骤4:编译
cd linux-3.2-FS210-V3
cp fs210_defconfig ./config
make zImage

步骤5:编译驱动源码
cd fs210_led
vim Makefile

将第3,4行改为以下结果,

保存退出 (命令模式下输入“:wq”)
make

cp fs210_led.ko /source/rootfs
步骤6:执行
make led_test

步骤7:启动开发版
板子正常启动

ls
加载驱动
insmod fs210_led.ko
mknod /dev/led c 250 0
chmod 777 /dev/led
./led_test

实验现象

附:程序源码
fs210_led.c
1 #include <linux/module.h> 2 #include <linux/kernel.h> 3 #include <linux/init.h> 4 #include <linux/fs.h> 5 #include <linux/cdev.h> 6 #include <asm/io.h> 7 8 #include "fs210_led.h" 9 10 MODULE_LICENSE("Dual BSD/GPL"); 11 MODULE_AUTHOR("farsight"); 12 13 #define GPC0CON 0xe0200060 14 #define GPC0DAT 0xe0200064 15 16 static int led_major = 250; 17 static int led_minor = 0; 18 static struct cdev led_cdev; 19 static void *gpc0con, *gpc0dat; 20 21 static void led_init(void) 22 { 23 writel((readl(gpc0con) & ~(0xff<<12)) | (0x11<<12), gpc0con); 24 writel(0, gpc0dat); 25 } 26 27 static void led_on(int num) 28 { 29 writel((readl(gpc0dat) | (0x1 << num)), gpc0dat); 30 } 31 32 static void led_off(int num) 33 { 34 writel((readl(gpc0dat) & ~(0x1 << num)), gpc0dat); 35 } 36 37 static int fs210_led_open(struct inode *inode, struct file *file) 38 { 39 printk("led: device open\n"); 40 41 return 0; 42 } 43 44 static int fs210_led_release(struct inode *inode, struct file *file) 45 { 46 printk("led: device close\n"); 47 48 return 0; 49 } 50 51 static long fs210_led_ioctl(struct file *file, unsigned int cmd, unsigned long arg) 52 { 53 int pos[] = {-1, 3, 4}; 54 55 if ((arg < 1) || (arg > 2)) return -EINVAL; 56 57 switch ( cmd ) 58 { 59 case LED_ON : 60 led_on(pos[arg]); 61 break; 62 case LED_OFF : 63 led_off(pos[arg]); 64 break; 65 default : 66 return -EINVAL; 67 } 68 69 return 0; 70 } 71 72 static struct file_operations fs210_led_ops = { 73 .owner = THIS_MODULE, 74 .open = fs210_led_open, 75 .release = fs210_led_release, 76 .unlocked_ioctl = fs210_led_ioctl 77 }; 78 79 static int led_setup_cdev(struct cdev *cdev, struct file_operations *fops) 80 { 81 int result; 82 83 dev_t devno = MKDEV(led_major, led_minor); 84 cdev_init(cdev, fops); 85 cdev->owner = THIS_MODULE; 86 result = cdev_add(cdev, devno, 1); 87 if(result) 88 { 89 printk("led: cdev add failed\n"); 90 return result; 91 } 92 93 return 0; 94 } 95 96 static int __init fs210_led_init(void) 97 { 98 int result; 99 dev_t devno = MKDEV(led_major, led_minor); 100 101 result = register_chrdev_region(devno, 1, "fs210_led"); 102 if(result) 103 { 104 printk("led: unable to get major %d\n", led_major); 105 return result; 106 } 107 108 result = led_setup_cdev(&led_cdev, &fs210_led_ops); 109 if(result) 110 return result; 111 112 gpc0con = ioremap(GPC0CON, 4); 113 gpc0dat = ioremap(GPC0DAT, 4); 114 led_init(); 115 116 printk("led: driver installed, with major %d!\n", led_major); 117 118 return 0; 119 } 120 121 static void __exit fs210_led_exit(void) 122 { 123 dev_t devno = MKDEV(led_major, led_minor); 124 125 cdev_del(&led_cdev); 126 unregister_chrdev_region(devno, 1); 127 iounmap(gpc0con); 128 iounmap(gpc0dat); 129 printk("led: driver uninstalled!\n"); 130 } 131 132 module_init(fs210_led_init); 133 module_exit(fs210_led_exit);
led_test.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <fcntl.h> 5 #include <sys/types.h> 6 #include <sys/ioctl.h> 7 8 #include "fs210_led.h" 9 10 int main() 11 { 12 int fd; 13 14 fd = open("/dev/led", O_RDWR); 15 if (fd < 0) 16 { 17 perror("fail to open"); 18 exit(-1); 19 } 20 while ( 1 ) 21 { 22 ioctl(fd, LED_ON, 1); 23 sleep(1); 24 ioctl(fd, LED_OFF, 1); 25 sleep(1); 26 } 27 28 return 0; 29 }
浙公网安备 33010602011771号