步骤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 }

 

 

  

  

posted on 2018-08-06 17:06  kingofloong  阅读(585)  评论(0)    收藏  举报