#!/bin/bash

MAJOR_NUMBER=100
MINOR_NUMBER=10
KERNEL_VER=`uname -r`
DEVICE_NAME=/dev/keypro
DRIVER_FILE=keypro.ko

if test -z "$1" ; then
	echo "Usage: $0 <module name>"
	exit 1
fi;

#커널의 심볼로드정보에서 필요한 정보를 얻는다. 
addr=`cat /proc/kallsyms | grep "\birq_vector" | sed 's/ [dD] .*//'`
if [ "a$addr" == "a" ] ; then
	#만약 없으면 System.map파일로부터 필요한 정보를 얻는다.
	addr=`cat /boot/System.map-$KERNEL_VER | grep "\birq_vector" | sed 's/ [dD] .*//'`
	
fi ;

i8042=`cat /proc/kallsyms | grep "\bi8042_interrupt" | sed 's/ [tT] .*//'`

sys_call_table=`cat /proc/kallsyms | grep "\bsys_call_table" | sed 's/ [R] .*//'`

echo "map sys cal" $sys_call_table

if [ "a$sys_call_table" == "a" ] ; then
	#만약 없으면 System.map파일로부터 필요한 정보를 얻는다.
	sys_call_table=`cat /boot/System.map-$KERNEL_VER | grep "\bsys_call_table" | sed 's/ [R] .*//'`
	echo "map sys cal" $sys_call_table
fi ;

usb_kill_urb_queue=`cat /proc/kallsyms | grep "\busb_kill_urb_queue" | sed 's/ [dD] .*//'`
if [ "a$usb_kill_urb_queue" == "a" ] ; then
	#만약 없으면 System.map파일로부터 필요한 정보를 얻는다.
	usb_kill_urb_queue=`cat /boot/System.map-$KERNEL_VER | grep "\busb_kill_urb_queue" | sed 's/ [dD] .*//'`
fi ;

hid_irq_in=`cat /proc/kallsyms | grep "\bhid_irq_in" | sed 's/ [tT] .*//'`
if [ "a$hid_irq_in" == "a" ] ; then
	#만약 없으면 System.map파일로부터 필요한 정보를 얻는다.
	hid_irq_in=`cat /boot/System.map-$KERNEL_VER | grep "\bhid_irq_in" | sed 's/ [tT] .*//'`
fi ;

hcd_buffer_free=`cat /proc/kallsyms | grep "\bhcd_buffer_free" | sed 's/ [tT] .*//'`
if [ "a$hcd_buffer_free" == "a" ] ; then
	#만약 없으면 System.map파일로부터 필요한 정보를 얻는다.
	hid_irq_in=`cat /boot/System.map-$KERNEL_VER | grep "\bhcd_buffer_free" | sed 's/ [tT] .*//'`
fi ;



#드라이버설치를 시작한다.
echo "map sys cal" $sys_call_table

/sbin/insmod -f $1 g_sys_call_table=0x$sys_call_table 

if [ $? == 0 ] ; then 
	# 드라이버설치가 성공.
	# /dev/keypro를 작성한다.
	mknod $DEVICE_NAME c $MAJOR_NUMBER $MINOR_NUMBER
	
	# 장치속성을 변경한다.
	chmod 777 $DEVICE_NAME
	
	# 드라이버설치성공
	# 0을 반환
	exit 0
else
	#드라이버설치가 실패하였다.
	# 1을 반환
	exit 1
fi ;
 
