急,按键驱动挂载不上,求各路大神帮忙,谢谢
陈加明 2016-10-25 11:29:42 困惑了好几天的问题,改了设备号,内存映射的地址也改了,驱动名字也换了,还是出现同样的问题
最开始,首先查找设备号的挂载情况
root@BoxLab:~# cat /proc/devices
Character devices:
1 mem
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
10 misc
13 input
21 sg
29 fb
81 video4linux
89 i2c
108 ppp
116 alsa
128 ptm
136 pts
166 ttyACM
180 usb
188 ttyUSB
189 usb_device
204 ttySAC
216 rfcomm
243 ump
244 mali
252 media
253 ttyGS
254 rtc
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
254 device-mapper
查看内存情况:
root@BoxLab:~# cat /proc/iomem
03830000-038300ff : samsung-i2s.0
03830000-038300ff : samsung-i2s
05000000-0500ffff : smsc911x
05000000-0500ffff : smsc911x
10060000-10060fff : s3c2410-wdt
10060000-10060fff : s3c2410-wdt
10070000-100700ff : s3c64xx-rtc
10070000-100700ff : s3c64xx-rtc
100a0000-100a001f : samsung-keypad
100b0000-100b0fff : s5p-tvout-cec
100b0000-100b0fff : s5p-tvout-cec
10800000-10800fff : s5p-fimg2d
10800000-10800fff : s5p-fimg2d
10a40000-10a40fff : s5p-sysmmu.15
10a40000-10a40fff : s5p-sysmmu.15
11800000-11800fff : s3c-fimc.0
11800000-11800fff : s3c-fimc
11810000-11810fff : s3c-fimc.1
11810000-11810fff : s3c-fimc
11820000-11820fff : s3c-fimc.2
11820000-11820fff : s3c-fimc
11830000-11830fff : s3c-fimc.3
11830000-11830fff : s3c-fimc
11840000-1184ffff : s5p-jpeg
11840000-1184ffff : s5p-jpeg
11880000-11880fff : s3c-csis.0
11880000-11880fff : s3c-csis
11890000-11890fff : s3c-csis.1
11890000-11890fff : s3c-csis
11a20000-11a20fff : s5p-sysmmu.1
11a20000-11a20fff : s5p-sysmmu.1
11a30000-11a30fff : s5p-sysmmu.2
11a30000-11a30fff : s5p-sysmmu.2
11a40000-11a40fff : s5p-sysmmu.3
11a40000-11a40fff : s5p-sysmmu.3
11a50000-11a50fff : s5p-sysmmu.4
11a50000-11a50fff : s5p-sysmmu.4
11a60000-11a60fff : s5p-sysmmu.5
11a60000-11a60fff : s5p-sysmmu.5
11c00000-11c07fff : s3cfb.0
11c00000-11c07fff : s3cfb
12480000-12480fff : s3c-usbgadget
12480000-12480fff : s3c-usbgadget
12530000-12530fff : s3c-sdhci.2
12530000-12530fff : mmc1
12540000-12540fff : s3c-sdhci.3
12540000-12540fff : mmc2
12550000-12550fff : dw_mmc
12550000-12550fff : mmc0
12580000-125800ff : s5p-ehci
12680000-12681000 : s3c-pl330.1
12680000-12681000 : s3c-pl330
12690000-12691000 : s3c-pl330.2
12690000-12691000 : s3c-pl330
126c0000-126c1fff : exynos4412-adc
12850000-12851000 : s3c-pl330.0
12850000-12851000 : s3c-pl330
12c00000-12c0ffff : s5p-vp
12c00000-12c0ffff : s5p-vp
12c10000-12c1ffff : s5p-mixer
12c10000-12c1ffff : s5p-mixer
12c20000-12c2ffff : s5p-sdo
12d00000-12dfffff : s5p-hdmi
12d00000-12dfffff : s5p-hdmi
12e20000-12e20fff : s5p-sysmmu.12
12e20000-12e20fff : s5p-sysmmu.12
13000000-13000097 : Mali-400 GP
13001000-1300102f : Mali-400 L2 cache
13003000-13003023 : Mali-400 MMU for GP
13004000-13004023 : Mali-400 MMU for PP 0
13005000-13005023 : Mali-400 MMU for PP 1
13006000-13006023 : Mali-400 MMU for PP 2
13007000-13007023 : Mali-400 MMU for PP 3
13008000-130090ef : Mali-400 PP 0
1300a000-1300b0ef : Mali-400 PP 1
1300c000-1300d0ef : Mali-400 PP 2
1300e000-1300f0ef : Mali-400 PP 3
13400000-1340ffff : s3c-mfc
13400000-1340ffff : s3c-mfc
13620000-13620fff : s5p-sysmmu.13
13620000-13620fff : s5p-sysmmu.13
13630000-13630fff : s5p-sysmmu.14
13630000-13630fff : s5p-sysmmu.14
13800000-138000ff : s5pv210-uart.0
13800000-138000ff : s5pv210-uart
13810000-138100ff : s5pv210-uart.1
13810000-138100ff : s5pv210-uart
13820000-138200ff : s5pv210-uart.2
13820000-138200ff : s5pv210-uart
13830000-138300ff : s5pv210-uart.3
13830000-138300ff : s5pv210-uart
13870000-13870fff : s3c2440-i2c.1
13870000-13870fff : s3c2440-i2c
13890000-13890fff : s3c2440-i2c.3
13890000-13890fff : s3c2440-i2c
138a0000-138a0fff : s3c2440-i2c.4
138a0000-138a0fff : s3c2440-i2c
138b0000-138b0fff : s3c2440-i2c.5
138b0000-138b0fff : s3c2440-i2c
138d0000-138d0fff : s3c2440-i2c.7
138d0000-138d0fff : s3c2440-i2c
138e0000-138e03ff : s5p-i2c-hdmi-phy
138e0000-138e03ff : s5p-i2c-hdmi-phy
13940000-139400ff : s3c64xx-spi.2
13940000-139400ff : s3c64xx-spi
40000000-6dffffff : System RAM
40040000-40933fff : Kernel text
40934000-40a156b7 : Kernel data
70000000-bfefffff : System RAM
挂载时提示:
root@BoxLab:~# insmod keys_drv.ko
[ 615.945684] KEYS_DRV: Device Initialize.
insmod: can't insert 'keys_drv.ko': Device or resource busy
root@BoxLab:~#
root@BoxLab:~# cat /proc/devices //这时多了keyy,设备号是168
Character devices:
1 mem
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
10 misc
13 input
21 sg
29 fb
81 video4linux
89 i2c
108 ppp
116 alsa
128 ptm
136 pts
166 ttyACM
168 keyy
180 usb
188 ttyUSB
189 usb_device
204 ttySAC
216 rfcomm
243 ump
244 mali
252 media
253 ttyGS
254 rtc
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
254 device-mapper
root@BoxLab:~#
root@BoxLab:~# lsmod //但是lsmod 是空的
root@BoxLab:~#
附录我的代码,请帮忙分析:
#define DRIVER_NAME "key_drv"
static volatile unsigned int *gpncon = NULL;
static int keys_major = 168; //主设备号设置为168
dev_t dev;
struct cdev *keys_cdev;
static struct class *keys_class = NULL;
static struct device *keys_device = NULL;
static unsigned long keys_pins[] =
{
EXYNOS4_GPX1(1),
EXYNOS4_GPX1(2),
EXYNOS4_GPX3(2)
};
static unsigned char keys_names[][8] =
{
"GPX1_1",
"GPX1_2",
"GPX3_2"
};
static int keys_open(struct inode *inode, struct file *file)
{
DPRINTK("keys_open.\n");
return 0;
}
static int keys_close(struct inode *inode, struct file *file)
{
DPRINTK("keys_close.\n");
return 0;
}
static int keys_read(struct file *file, char *buf, size_t count)
{
unsigned char keyval[3] = {1, 1, 1};
int id = 0;
DPRINTK("keys_read.\n");
for(id = 0; id < sizeof(keys_pins) / sizeof(keys_pins[0]); id++)
{
keyval[id] = gpio_get_value(keys_pins[id]);
}
return copy_to_user(buf, keyval, sizeof(keyval));
}
static struct file_operations key_fops = {
.owner = THIS_MODULE,
.open = keys_open,
.release= keys_close,
.read = keys_read,
};
static int __init keys_init(void)
{
int err = 0, id = 0;
int result = 0;
printk("KEYS_DRV: Device Initialize.\n");
if(keys_major)
{
dev = MKDEV(keys_major, 0);
result = register_chrdev_region(dev, 1, "keyy"); //挂载的那个keyy
}
else
{
result = alloc_chrdev_region(&dev, 0, 1, "keyy"); //挂载的那个keyy
keys_major = MAJOR(dev);
}
if(result < 0)
{
DPRINTK("can't get major %d\n", keys_major);
}
DPRINTK("major is %d\n", keys_major);
keys_cdev = cdev_alloc();
keys_cdev->ops = &key_fops;
cdev_init(keys_cdev, &key_fops);
cdev_add(keys_cdev, dev, 1);
keys_class = class_create(THIS_MODULE, DRIVER_NAME);
if(IS_ERR(keys_class))
{
err = PTR_ERR(keys_class);
DPRINTK("create class error.\n");
}
keys_device = device_create(keys_class, NULL, MKDEV(keys_major, 0), NULL, DRIVER_NAME);
DPRINTK("add success.\n");
for(id = 0; id < sizeof(keys_pins) / sizeof(keys_pins[0]); id++)
{
char label[32] = {'\0'};
strcpy(label, keys_names[id]);
strcpy(&label[strlen(label)], "_KEY");
err = gpio_request(keys_pins[id], label);
if (err)
{
DPRINTK("Failed to request for key pin %d!\r\n",err);
return err;
}
s3c_gpio_cfgpin(keys_pins[id], S3C_GPIO_SFN(0));
s3c_gpio_setpull(keys_pins[id], S3C_GPIO_PULL_NONE);
}
return 0;
}
static void __exit keys_exit(void)
{
printk("KEYS_DRV: Module exit!\n");
iounmap(gpncon);
device_destroy(keys_class, MKDEV(keys_major, 0));
class_destroy(keys_class);
cdev_del(keys_cdev);
unregister_chrdev_region(dev, 1);
}
module_init(keys_init);
module_exit(keys_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("zengzb");