硬件平台: 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);
上面这份源码是借鉴了网上大牛的,都不知道大牛姓啥名谁,惭愧。在此遥谢!
阅读(3532) | 评论(0) | 转发(2) |