From e7c802761fa5a633fa44ba01f6767e218fad5516 Mon Sep 17 00:00:00 2001 From: Pavel Cheblakov Date: Thu, 23 Sep 2010 19:55:15 +0700 Subject: [PATCH] added udev support - Added udev rule (placed in udev/). It allows to set group and permissions of all lsi6-devices in /dev - Added handling error of get_device_no function - Removed unnecessary scripts - Modifed documentation --- README | 4 ++++ doc/readme_pci.koi8 | 56 +++++++++++++++++++++++++++++---------------- lsi6_main.c | 52 ++++++++++++++++++++++++++--------------- makedevices | 25 -------------------- reload | 6 ----- udev/91-lsi6.rules | 2 +- 6 files changed, 75 insertions(+), 70 deletions(-) create mode 100644 README delete mode 100755 makedevices delete mode 100755 reload diff --git a/README b/README new file mode 100644 index 0000000..de5dae9 --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +lsi6 - line serial interface for CAMAC +-------------------------------------- + +See documentation in doc/readme_pci.koi8 \ No newline at end of file diff --git a/doc/readme_pci.koi8 b/doc/readme_pci.koi8 index 9610465..1955cf9 100644 --- a/doc/readme_pci.koi8 +++ b/doc/readme_pci.koi8 @@ -5,35 +5,43 @@ ��������� ���������� ���������� ������ 1.4 �� 24.12.2001 ������������ � �������� ������� camt ������ ��. -2. ��������� ������. +2. ��������� ��������. -2.1. ����� ���������� ������ ���������� ����������� ��������� ���� -Linux � ���������, ��� ���� ������������� �� ������ ������. -��� ���������� ������ ����� �������������� ������������ ����� ���� -� ������� modpost (��� ���� 2.6.x) - -2.2. ��� Linux 2.6.x � Makefile ���������� ���� �� -��������� ����, ��������, -LINUX_KERNEL_PATH = /usr/src/linux-2.6.9 +2.1. ��� ������ �������� ���������� ����� ������������ ����� +��� ������� ������ ����. �� ���������, ������ ����� ������������ +��� �������� ����. � ��������� ������ ���� ���������� ���������� +KERNELDIR. 2.2. -�������������� ������ � �������� �������: -make -make camt +�������������� ������� � �������� �������: +# make modules +# make camt + +2.3. +���������������� udev: +� �������� udev/ ��������� ������� 91-lsi6.rules +��� ���������� ����������� � ������� � ��������� udev +(��� �������, /etc/udev/rules.d) � ����������� �������������� +GROUP � MODE � ����������� �� ����, ����� ������ ����� ������������ +���������� lsi6 � ����� ����� ������� ����� ����� + +��� ����, ��� �� ������ ������� "���������" ����� �������������� +��������: +# udevtrigger -����������������: -make install +2.4. -������� ����� ���������: -make devices +���������������� �������: +# make modules_install ��������� ������: -insmod lsi6.o +modprobe lsi6 ��� ���������� - ����� ���������� � �������� �����-������ ����������� ������������� bios-��. ���� � ������� ��������� ����, ��� ������������� ����� �������. -(���������� - � ���� 2.6.x ������ ����� ���������� .ko) + +��� �������� ������� ������� ����������� udev-�� �������������. 3. �������������. ���� ���������� /dev/lsi6cardNchannelM @@ -47,7 +55,7 @@ insmod lsi6.o X � Q � ��������������� ����, �.�. ���� � ������� ��� X=1, ��� �������� ���������� ������� X. -5. ������������ � ������ Linux +5. ������������ � ������ Linux (�� 1.06) 2.2.0, 2.2.25 2.4.0 @@ -56,5 +64,13 @@ insmod lsi6.o 2.6.0 2.6.9 -�.�.������, ���. 39-42-84 +��� ������ 1.06.x +2.6.18 +2.6.33 (����������� ������ ������) + +�.�.������, ���. 329-42-84 V.R.Mamkin@inp.nsk.su + +�.�.�������� (��������� ����� ������ 1.05), +���. 329-42-25 +P.B.Cheblakov@inp.nsk.su diff --git a/lsi6_main.c b/lsi6_main.c index e0e5f23..f4abd3e 100644 --- a/lsi6_main.c +++ b/lsi6_main.c @@ -21,11 +21,6 @@ #include "lsi6camac.h" #include "lsi6_lib.h" -/* -extern void *kmalloc(size_t, int); -extern void kfree(const void *); -*/ - #undef DEBUG #ifdef DEBUG @@ -35,8 +30,8 @@ extern void kfree(const void *); #endif #define DRV_NAME "lsi6" -#define DRV_VERSION "1.06" -#define DRV_RELDATE "16 Sep. 2010" +#define DRV_VERSION "1.06.1" +#define DRV_RELDATE "23 Sep. 2010" #define DRV_AUTHOR "V.Mamkin, P.Cheblakov" MODULE_AUTHOR(DRV_AUTHOR); @@ -70,7 +65,7 @@ static int get_device_no(int major) if (lsi6_dev[i].major == major) return i; - return -1; //TODO fix it. it's very dangerous + return -1; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19) @@ -109,12 +104,18 @@ static irqreturn_t lsi6_interrupt(int irq, void *dev_id, struct pt_regs *unused) } static int lsi6_open(struct inode * inode, struct file * file) { - unsigned int chnum = MINOR(inode->i_rdev); - unsigned int card = get_device_no(MAJOR(inode->i_rdev)); - lsi6_dev_t *lsi = &lsi6_dev[card]; - lsi6_regs_t *regs = (lsi6_regs_t *)lsi->base; unsigned long flags; int csr; + unsigned int chnum = MINOR(inode->i_rdev); + unsigned int card = get_device_no(MAJOR(inode->i_rdev)); + lsi6_dev_t *lsi; + lsi6_regs_t *regs; + + if (card < 0) + return -ENXIO; + + lsi = &lsi6_dev[card]; + regs = (lsi6_regs_t *)lsi->base; DP(printk(DRV_NAME ": open channel %d\n", chnum)); @@ -137,14 +138,19 @@ static int lsi6_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { int chnum = MINOR(inode->i_rdev); - unsigned int card = get_device_no(MAJOR(inode->i_rdev)); - lsi6_dev_t *lsi = &lsi6_dev[card]; unsigned long * ptr = (unsigned long * ) arg; unsigned long x; int n,a,f, rc; unsigned long flags; unsigned long volatile jiffies_start, jiffies_end; int jiffies_left; + unsigned int card = get_device_no(MAJOR(inode->i_rdev)); + lsi6_dev_t *lsi; + + if (card < 0) + return -ENXIO; + + lsi = &lsi6_dev[card]; n = N_NAF(cmd); a = A_NAF(cmd); @@ -287,12 +293,17 @@ static ssize_t lsi6_read(struct file * file, char * buf, size_t count, loff_t *ppos) { unsigned int chnum=MINOR(file->f_dentry->d_inode->i_rdev); - unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev)); - lsi6_dev_t *lsi = &lsi6_dev[card]; int naf = *ppos; int n,a,f, rc; unsigned long x; unsigned long flags; + unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev)); + lsi6_dev_t *lsi; + + if (card < 0) + return -ENXIO; + + lsi = &lsi6_dev[card]; n = N_NAF(naf); a = A_NAF(naf); @@ -347,12 +358,17 @@ static ssize_t lsi6_write(struct file * file, const char * buf, size_t count, loff_t *ppos) { unsigned int chnum=MINOR(file->f_dentry->d_inode->i_rdev); - unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev)); - lsi6_dev_t *lsi = &lsi6_dev[card]; int naf = *ppos; int n,a,f, rc; unsigned long x; unsigned long flags; + unsigned int card = get_device_no(MAJOR(file->f_dentry->d_inode->i_rdev)); + lsi6_dev_t *lsi; + + if (card < 0) + return -ENXIO; + + lsi = &lsi6_dev[card]; n = N_NAF(naf); a = A_NAF(naf); diff --git a/makedevices b/makedevices deleted file mode 100755 index 76e42f6..0000000 --- a/makedevices +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -number_cards=1 -number_channels=6 - -# ---------------------------------------------------------- - -cardnum=0 - -while true; do - chnum=0 - while true; do - - mknod -m 0666 /dev/lsi6card$(($cardnum+1))channel$(($chnum+1)) c $((122+$cardnum)) $chnum - - chnum=$(($chnum+1)) - if test "$chnum" == "$number_channels"; then - break; - fi - done - cardnum=$(($cardnum+1)) - if test "$cardnum" == "$number_cards"; then - break; - fi -done diff --git a/reload b/reload deleted file mode 100755 index 175044b..0000000 --- a/reload +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -make clean -make -rmmod lsi6 -insmod lsi6.o diff --git a/udev/91-lsi6.rules b/udev/91-lsi6.rules index c6febc3..8a945bd 100644 --- a/udev/91-lsi6.rules +++ b/udev/91-lsi6.rules @@ -1 +1 @@ -SUBSYSTEM=="pci", SYSFS{device}=="0x3333", SYSFS{vendor}=="0x1172", PROGRAM="/root/ttt.pl %M %m" \ No newline at end of file +KERNEL=="lsi6*", GROUP="root", MODE="0660" \ No newline at end of file