急,按键驱动挂载不上,求各路大神帮忙,谢谢

时间:2021-02-23 14:08:32
困惑了好几天的问题,改了设备号,内存映射的地址也改了,驱动名字也换了,还是出现同样的问题

最开始,首先查找设备号的挂载情况
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");

11 个解决方案

#1


大神快出来帮忙下

#2


是不是设备运行中啊?要先结束该设备运行,或者用U盘系统复制到制定驱动位置。

#3


设备没有在运行吧,驱动都挂载不上去,可执行程序执行不了,有没有什么指令可以查询设备有在运行的,还有这么结束设备运行

#4


引用 2 楼 uid123 的回复:
是不是设备运行中啊?要先结束该设备运行,或者用U盘系统复制到制定驱动位置。


设备没有在运行吧,驱动都挂载不上去,可执行程序执行不了,有没有什么指令可以查询设备有在运行的,还有怎么结束设备运行

#5


是不是有别的设备硬件冲突?原本这个设备是要占固定的设备地址号,但是你用的系统其他设备已经占用了,所以设备挂接不上??

#6


引用 5 楼 uid123 的回复:
是不是有别的设备硬件冲突?原本这个设备是要占固定的设备地址号,但是你用的系统其他设备已经占用了,所以设备挂接不上??

会有这个问题吗,我这个设备本来是动态分配设备号的,它的设备号应该不会去占固定的设备地址号把,就是因为提示insmod: can't insert 'keys_drv.ko': Device or resource busy这个错误,所以我才改静态IP为168的,168上面那个截图也没有被其他设备占用啊

#7


可能你的用的引脚,被其他设备占用,你要先释放该引脚

#8


看probe 有没有完成

#9


引用 5 楼 uid123 的回复:
是不是有别的设备硬件冲突?原本这个设备是要占固定的设备地址号,但是你用的系统其他设备已经占用了,所以设备挂接不上??

问题找到了

引用 7 楼 qq_29480247 的回复:
可能你的用的引脚,被其他设备占用,你要先释放该引脚

哈哈,昨天找到问题了,err = gpio_request(keys_pins[id], label);这句出问题了,err还是0,要先释放引脚,gpio_free(keys_pins[id]),然后在gpio_request(keys_pins[id], label)就可以了,不过有一个问题,我怎么知道被哪个设备的引脚占用了。

#10


引用 8 楼 xuweiwei1860 的回复:
看probe 有没有完成

我找到问题了,是引脚被占用,但是要怎么查找到底被哪个设备占用呢?
还有probe怎么使用呢 急,按键驱动挂载不上,求各路大神帮忙,谢谢

#11


引用 7 楼 qq_29480247 的回复:
可能你的用的引脚,被其他设备占用,你要先释放该引脚

对的,大神,哈哈,昨天找到问题了,err = gpio_request(keys_pins[id], label);这句出问题了,err还是0,要先释放引脚,gpio_free(keys_pins[id]),然后在gpio_request(keys_pins[id], label)就可以了,不过有一个问题,我怎么知道被哪个设备的引脚占用了。

#1


大神快出来帮忙下

#2


是不是设备运行中啊?要先结束该设备运行,或者用U盘系统复制到制定驱动位置。

#3


设备没有在运行吧,驱动都挂载不上去,可执行程序执行不了,有没有什么指令可以查询设备有在运行的,还有这么结束设备运行

#4


引用 2 楼 uid123 的回复:
是不是设备运行中啊?要先结束该设备运行,或者用U盘系统复制到制定驱动位置。


设备没有在运行吧,驱动都挂载不上去,可执行程序执行不了,有没有什么指令可以查询设备有在运行的,还有怎么结束设备运行

#5


是不是有别的设备硬件冲突?原本这个设备是要占固定的设备地址号,但是你用的系统其他设备已经占用了,所以设备挂接不上??

#6


引用 5 楼 uid123 的回复:
是不是有别的设备硬件冲突?原本这个设备是要占固定的设备地址号,但是你用的系统其他设备已经占用了,所以设备挂接不上??

会有这个问题吗,我这个设备本来是动态分配设备号的,它的设备号应该不会去占固定的设备地址号把,就是因为提示insmod: can't insert 'keys_drv.ko': Device or resource busy这个错误,所以我才改静态IP为168的,168上面那个截图也没有被其他设备占用啊

#7


可能你的用的引脚,被其他设备占用,你要先释放该引脚

#8


看probe 有没有完成

#9


引用 5 楼 uid123 的回复:
是不是有别的设备硬件冲突?原本这个设备是要占固定的设备地址号,但是你用的系统其他设备已经占用了,所以设备挂接不上??

问题找到了

引用 7 楼 qq_29480247 的回复:
可能你的用的引脚,被其他设备占用,你要先释放该引脚

哈哈,昨天找到问题了,err = gpio_request(keys_pins[id], label);这句出问题了,err还是0,要先释放引脚,gpio_free(keys_pins[id]),然后在gpio_request(keys_pins[id], label)就可以了,不过有一个问题,我怎么知道被哪个设备的引脚占用了。

#10


引用 8 楼 xuweiwei1860 的回复:
看probe 有没有完成

我找到问题了,是引脚被占用,但是要怎么查找到底被哪个设备占用呢?
还有probe怎么使用呢 急,按键驱动挂载不上,求各路大神帮忙,谢谢

#11


引用 7 楼 qq_29480247 的回复:
可能你的用的引脚,被其他设备占用,你要先释放该引脚

对的,大神,哈哈,昨天找到问题了,err = gpio_request(keys_pins[id], label);这句出问题了,err还是0,要先释放引脚,gpio_free(keys_pins[id]),然后在gpio_request(keys_pins[id], label)就可以了,不过有一个问题,我怎么知道被哪个设备的引脚占用了。