Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1584252
  • 博文数量: 239
  • 博客积分: 1760
  • 博客等级: 上尉
  • 技术积分: 1595
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-08 23:53
文章分类

全部博文(239)

文章存档

2016年(1)

2015年(28)

2014年(53)

2013年(42)

2012年(50)

2011年(65)

分类: LINUX

2012-03-12 22:36:16

硬件平台: s3c2440
软件平台: u-boot-2011.12 + linux-3.1.6

1、linux内核配置
确保编译内核时编译如下选项:
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
如果CONFIG_HOTPLUG和CONFIG_NET不选或没全选上的话,/proc/sys/kernel下将不会创建 hotplug文件.(参见kernel/sysctl.c)
 
2、busybox
添加mdev支持

3、编辑/etc/fstab(在开发板系统上)
内容如下
---------------------------------------------------------------------------------------------------------->
#device         mount-point     type    options         dump    fsck order
proc              /proc              proc    defaults                   0       0
sysfs             /sys                sysfs   defaults                  0       0
tmpfs            /var                tmpfs   defaults                  0       0
tmpfs            /tmp               tmpfs   defaults                  0       0
mdev            /dev               tmpfs   defaults                  0       0
tmpfs           /dev/shm         tmpfs    defaults                  0       0
usbfs           /proc/bus/usb   usbfs    defaults                  0       0
----------------------------------------------------------------------------------------------------------<

4、编辑/etc/init.d/rcS(在开发板上)
内容如下:
---------------------------------------------------------------------------------------------------------->
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

mount -a    #是执行/etc/fstab里面的文件系统加载
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s   #主要是这个很耗时间,因为mdev扫描 /sys/class 和/sys/block中所有的类设备目录,
            如果在目录中含有名为“dev”的文件,且文件中包 含的是设备号,
            则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。
            一般只在启动时才执行一次 “mdev -s”。

/bin/hostname -F /etc/sysconfig/HOSTNAME
----------------------------------------------------------------------------------------------------------<

5、重新编译内核和下面的测试驱动
insmod xx/mdevtest.ko
ls /dev/mdevtest_dev*    #如果有东西说明mdev移植成功
rmmod mdevtest


下面是测试mdev是否工作的驱动源码,当然也可以直接用 drivers.rar,只要该下内核路径就可以了
#include
#include
#include

#include        /* printk() */
#include            /* everything... */
#include
#include     /* request_irq() */
#include
#include         /* copy_to_user() */
#include         /* mdelay() */
#include        /*class_create()*/


#define VERSION_STRING  "mdev test driver"
#define DEVICE_NAME "mdevtest"

unsigned int mdevtest_major_number=0;
struct cdev mdevtest_dev;
struct class *mdevtest_class;

static long mdevtest_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    return 0;
}

static struct file_operations mdevtest_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = mdevtest_ioctl,
};

static int __init mdevtest_init(void)
{
    int n_ret,n_devno;
    dev_t dev;

    n_ret = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME);
    mdevtest_major_number = MAJOR(dev);
    printk("Initial mdevtest driver!\n");
    if( n_ret < 0 )
    {
        printk("mdevtest:can't get major number %d\n", mdevtest_major_number);
        return n_ret;
    }

    n_devno = MKDEV(mdevtest_major_number, 0);
    cdev_init(&mdevtest_dev, &mdevtest_fops);
    mdevtest_dev.owner = THIS_MODULE;
    mdevtest_dev.ops   = &mdevtest_fops;

    n_ret = cdev_add(&mdevtest_dev, n_devno, 1);
    if(n_ret)
    {
        unregister_chrdev_region(dev, 1);
        printk("Error %d adding mdevtest device\n", n_ret);
        return n_ret;
    }
    mdevtest_class = class_create(THIS_MODULE, "mdevtest_class");
    if( IS_ERR(mdevtest_class) )
    {
        printk("Err: failed in creating class.\n");
        return -1;
    }
    /* register your own device in sysfs, and this will cause mdev to create corresponding device node */
    device_create(mdevtest_class, NULL, MKDEV(mdevtest_major_number, 0), NULL, "mdevtest_dev%d" , 0);

    return 0;
}

static void __exit mdevtest_cleanup(void)
{
    dev_t dev;

    dev = MKDEV(mdevtest_major_number, 0);

    cdev_del(&mdevtest_dev);
    device_destroy(mdevtest_class, MKDEV(mdevtest_major_number, 0));
    class_destroy(mdevtest_class);
    unregister_chrdev_region(dev, 1);

    printk("unregistered the %s\n", DEVICE_NAME);
}

module_init(mdevtest_init);
module_exit(mdevtest_cleanup);

MODULE_AUTHOR("transistor");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION(VERSION_STRING);
上面这份源码是借鉴了网上大牛的,都不知道大牛姓啥名谁,惭愧。在此遥谢!
阅读(3539) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~