added i2c_mangle.ko, ethtool, change AXE modules loading
This commit is contained in:
		
							
								
								
									
										31
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								Makefile
									
									
									
									
									
								
							| @@ -30,6 +30,8 @@ DROPBEAR=dropbear-2015.67 | ||||
| DROPBEAR_SBIN_FILES=dropbear | ||||
| DROPBEAR_BIN_FILES=dbclient dropbearconvert dropbearkey scp | ||||
|  | ||||
| ETHTOOL=ethtool-3.18 | ||||
|  | ||||
| # 10087? | ||||
| OSCAM_REV=10619 | ||||
|  | ||||
| @@ -64,17 +66,19 @@ dist: | ||||
| # create CPIO | ||||
| # | ||||
|  | ||||
| fs.cpio: kernel-modules busybox dropbear minisatip oscam tools/axehelper | ||||
| fs.cpio: kernel-modules busybox dropbear ethtool minisatip oscam tools/axehelper | ||||
| 	fakeroot tools/do_min_fs.py \ | ||||
| 	  -r "$(VERSION)" \ | ||||
| 	  -b "bash strace" \ | ||||
| 	  $(foreach m,$(EXTRA_AXE_MODULES), -e "$(EXTRA_AXE_MODULES_DIR)/$(m):lib/modules/axe/$(m)") \ | ||||
| 	  $(foreach m,$(ORIG_FILES), -e "$(EXTRA_AXE_MODULES_DIR)/../$(m):lib/modules/axe/$(m)") \ | ||||
| 	  -e "tools/i2c_mangle.ko:lib/modules/axe/i2c_mangle.ko" \ | ||||
| 	  $(foreach m,$(KMODULES), -e "kernel/$(m):lib/modules/$(m)") \ | ||||
| 	  -e "tools/axehelper:sbin/axehelper" \ | ||||
| 	  -e "apps/$(BUSYBOX)/busybox:bin/busybox" \ | ||||
| 	  $(foreach f,$(DROPBEAR_SBIN_FILES), -e "apps/$(DROPBEAR)/$(f):sbin/$(f)") \ | ||||
| 	  $(foreach f,$(DROPBEAR_BIN_FILES), -e "apps/$(DROPBEAR)/$(f):usr/bin/$(f)") \ | ||||
| 	  -e "apps/$(ETHTOOL)/ethtool:sbin/ethtool" \ | ||||
| 	  -e "apps/minisatip/minisatip:sbin/minisatip" \ | ||||
| 	  -e "apps/minisatip/icons/lr.jpg:usr/share/minisatip/icons/lr.jpg" \ | ||||
| 	  -e "apps/minisatip/icons/lr.png:usr/share/minisatip/icons/lr.png" \ | ||||
| @@ -131,7 +135,10 @@ kernel/arch/sh/boot/uImage.gz: kernel/drivers/usb/serial/cp210x.ko fs.cpio | ||||
| 	make -C kernel -j ${CPUS} PATH="$(PATH):$(TOOLPATH)" \ | ||||
| 	                          ARCH=sh CROSS_COMPILE=$(TOOLCHAIN_KERNEL)/bin/sh4-linux- uImage.gz | ||||
|  | ||||
| .PHONY: kernel-modules | ||||
| tools/i2c_mangle.ko: tools/i2c_mangle.c | ||||
| 	make -C tools ARCH=sh CROSS_COMPILE=$(TOOLCHAIN_KERNEL)/bin/sh4-linux- all | ||||
|  | ||||
| .PHONY: kernel-modules tools/i2c_mangle.ko | ||||
| kernel-modules: kernel/drivers/usb/serial/cp210x.ko | ||||
|  | ||||
| .PHONY: kernel | ||||
| @@ -250,6 +257,26 @@ apps/$(DROPBEAR)/dropbear: apps/$(DROPBEAR)/configure | ||||
| .PHONY: dropbear | ||||
| dropbear: apps/$(DROPBEAR)/dropbear | ||||
|  | ||||
| # | ||||
| # ethtool | ||||
| # | ||||
|  | ||||
| apps/$(ETHTOOL)/configure: | ||||
| 	$(call WGET,https://www.kernel.org/pub/software/network/ethtool/$(ETHTOOL).tar.gz,apps/$(ETHTOOL).tar.gz) | ||||
| 	tar -C apps -xzf apps/$(ETHTOOL).tar.gz | ||||
|  | ||||
| apps/$(ETHTOOL)/ethtool: apps/$(ETHTOOL)/configure | ||||
| 	cd apps/$(ETHTOOL) && \ | ||||
| 	  CC=$(TOOLCHAIN)/bin/sh4-linux-gcc \ | ||||
| 	  CFLAGS="-O2" \ | ||||
| 	./configure \ | ||||
| 	  --host=sh4-linux \ | ||||
| 	  --prefix=/ | ||||
| 	make -C apps/$(ETHTOOL) | ||||
|  | ||||
| .PHONY: ethtool | ||||
| ethtool: apps/$(ETHTOOL)/ethtool | ||||
|  | ||||
| # | ||||
| # oscam | ||||
| # | ||||
|   | ||||
| @@ -2,9 +2,15 @@ | ||||
| # SATIP AXE firmware configuration | ||||
| # | ||||
|  | ||||
| CFGVER="8" | ||||
| HOSTNAME="satip-axe" | ||||
| KMODULES="drivers/usb/serial/cp210x.ko drivers/usb/serial/pl2303.ko drivers/usb/serial/ftdi_sio.ko" | ||||
|  | ||||
| # | ||||
| # STV6210 baseband amplifier gain (0dB .. 16dB - 2dB step) | ||||
| # | ||||
| STV6210_BAMP="16dB" | ||||
|  | ||||
| # | ||||
| # ttyUSB names | ||||
| # | ||||
|   | ||||
| @@ -54,12 +54,14 @@ fi | ||||
| ifconfig lo 127.0.0.1 netmask 255.255.255.0 | ||||
|  | ||||
| # AXE modules and AXE hw initialization | ||||
| sync | ||||
| logger -p local0.notice "AXE drivers load start" | ||||
| axehelper i2c_reg_read 0xd0 0xf000 > /dev/null 2> /dev/null || logger -p local0.notice "I2C Demod #1(D0) failed" | ||||
| axehelper i2c_reg_read 0xd2 0xf000 > /dev/null 2> /dev/null || logger -p local0.notice "I2C Demod #2(D2) failed" | ||||
| d=/lib/modules/axe | ||||
| insmod $d/stapi_core_stripped.ko | ||||
| insmod $d/stapi_ioctl_stripped.ko | ||||
| insmod $d/axe_i2c.ko | ||||
| echo "i2c_dbg_trans 1" > /proc/bus/ivo_i2c | ||||
| insmod $d/i2c_mangle.ko | ||||
| insmod $d/axe_fe.ko | ||||
| insmod $d/axe_fp.ko | ||||
| insmod $d/axe_dmx.ko | ||||
| @@ -102,11 +104,9 @@ for i in $(cat /proc/devices); do | ||||
|   maj= | ||||
| done | ||||
| /etc/init.d/axe & | ||||
| axehelper wait 5000 -10 /tmp/axe-done | ||||
| axehelper wait 2000 -10 | ||||
| #nc -l 127.0.0.1:1001 -e /bin/true | ||||
| nc -l 127.0.0.1:1001 -e /bin/true | ||||
| rm -f /root/main_init.sh /tmp/axe-done | ||||
| echo "i2c_dbg_trans 0" > /proc/bus/ivo_i2c | ||||
| logger -p local0.notice "AXE drivers load finish" | ||||
|  | ||||
| # hostname | ||||
| test -r /etc/sysconfig/config && . /etc/sysconfig/config | ||||
|   | ||||
| @@ -6,12 +6,16 @@ if test "$MINISATIP" != "yes"; then | ||||
|   exit 0 | ||||
| fi | ||||
|  | ||||
| . /etc/init.d/axe-settings | ||||
|  | ||||
| # renice kernel demuxers | ||||
| a="" | ||||
| for i in $(ps -o pid,nice,comm | grep "kdmxts_64" | cut -d 'k' -f 1); do | ||||
|   if test "$i" -gt 15; then a="$a $i"; fi | ||||
| done | ||||
| renice -15 $a | ||||
| if test "$DEMUXERS_RENICE" = "yes"; then | ||||
|   a="" | ||||
|   for i in $(ps -o pid,nice,comm | grep "kdmxts_64" | cut -d 'k' -f 1); do | ||||
|     if test "$i" -gt 15; then a="$a $i"; fi | ||||
|   done | ||||
|   renice -15 $a | ||||
| fi | ||||
|  | ||||
| cd /tmp | ||||
| while test ! -f /tmp/nosatip; do | ||||
| @@ -20,8 +24,8 @@ while test ! -f /tmp/nosatip; do | ||||
|   done | ||||
|   . /etc/sysconfig/config | ||||
|   nice -5 minisatip -f -g $MINISATIP_OPTS | ||||
|   logger "minisatip exited $?, restarting" | ||||
|   logger -p local0.notice "minisatip exited $?, restarting" | ||||
|   if test -f /tmp/nosatip; then | ||||
|     sleep 87323123 | ||||
|   fi | ||||
| done | ||||
| if test -f /tmp/nosatip; then | ||||
|   sleep 87323123 | ||||
| fi | ||||
|   | ||||
							
								
								
									
										6
									
								
								tools/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								tools/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,12 @@ | ||||
| *.cmd | ||||
| axehelper | ||||
| axehelper.x86_64 | ||||
| syscall-dump.o | ||||
| syscall-dump.o.x86_64 | ||||
| syscall-dump.so | ||||
| syscall-dump.so.x86_64 | ||||
| i2c_mangle.mod.* | ||||
| i2c_mangle.o | ||||
| i2c_mangle.ko | ||||
| Module.symvers | ||||
| modules.order | ||||
|   | ||||
							
								
								
									
										7
									
								
								tools/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								tools/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| obj-m=i2c_mangle.o | ||||
|  | ||||
| all: | ||||
| 	make -C $(PWD)/kernel ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD)/tools modules | ||||
|  | ||||
| clean: | ||||
| 	make -C $(PWD)/kernel ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD)/tools clean | ||||
							
								
								
									
										187
									
								
								tools/i2c_mangle.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								tools/i2c_mangle.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,187 @@ | ||||
| #include <linux/module.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/idr.h> | ||||
| #include <linux/mutex.h> | ||||
| #include <linux/completion.h> | ||||
| #include <linux/hardirq.h> | ||||
| #include <linux/irqflags.h> | ||||
| #include <linux/rwsem.h> | ||||
| #include <asm/uaccess.h> | ||||
|  | ||||
| #define STV6120_1 (0xc0 >> 1) | ||||
| #define STV6120_2 (0xc6 >> 1) | ||||
|  | ||||
| extern int (*i2c_transfer_mangle)(struct i2c_adapter *adap, struct i2c_msg *msg, int num); | ||||
| int i2c_transfer2(struct i2c_adapter *adap, struct i2c_msg *msg, int num); | ||||
|  | ||||
| static struct i2c_adapter *i2c_adapter0; | ||||
| static int i2c_mangle_enable = 1; | ||||
| static int i2c_mangle_debug = 0; | ||||
| static int stv6120_gain = 8; | ||||
|  | ||||
| static void i2c_transfer_axe_dump(struct i2c_msg *msgs, int num) | ||||
| { | ||||
| 	int ret; | ||||
|  | ||||
| 	for (ret = 0; ret < num; ret++) { | ||||
| 		printk("i2c master_xfer[%d] %c, addr=0x%02x, " | ||||
| 			"len=%d%s, flags=0x%x\n", ret, (msgs[ret].flags & I2C_M_RD) | ||||
| 			? 'R' : 'W', msgs[ret].addr, msgs[ret].len, | ||||
| 			(msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "", | ||||
| 			msgs[ret].flags); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static void mangle(u8 *dst, struct i2c_msg *m, int i, int val, int shift, int mask) | ||||
| { | ||||
| 	memcpy(dst, m->buf, m->len); | ||||
| 	dst[i] &= ~(mask << shift); | ||||
| 	dst[i] |= (val & mask) << shift; | ||||
| 	if (i2c_mangle_debug & 2) | ||||
| 		printk("i2c mangle: i=%d val=0x%x shift=%i mask=0x%x (orig 0x%x new 0x%x)\n", | ||||
| 			i, val, shift, mask, m->buf[i], dst[i]); | ||||
| 	if (m->buf[i] != dst[i]) | ||||
| 		m->buf = dst; | ||||
| } | ||||
|  | ||||
| static void i2c_transfer_axe_mangle(struct i2c_msg *msgs, int num) | ||||
| { | ||||
| 	static u8 mbuf[4][32]; | ||||
| 	struct i2c_msg *m; | ||||
| 	int ret, r, i; | ||||
|  | ||||
| 	for (ret = 0; ret < num && ret < ARRAY_SIZE(mbuf); ret++) { | ||||
| 		m = msgs + ret; | ||||
| 		if (m->len < 1 || (m->flags & I2C_M_RD) != 0) | ||||
| 			continue; | ||||
| 		if (m->addr == STV6120_1 || m->addr == STV6120_2) | ||||
| 			for (r = m->buf[0], i = 1; i < m->len; i++, r++) | ||||
| 				if (r == 0x01 || r == 0x0b) | ||||
| 					mangle(mbuf[ret], m, i, stv6120_gain, 0, 0x0f); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static int i2c_transfer_axe(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | ||||
| { | ||||
| 	if (adap == i2c_adapter0) { | ||||
| 		if (i2c_mangle_debug & 1) | ||||
| 			i2c_transfer_axe_dump(msgs, num); | ||||
| 		if (i2c_mangle_enable) | ||||
| 			i2c_transfer_axe_mangle(msgs, num); | ||||
| 	} | ||||
| 	return i2c_transfer2(adap, msgs, num); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| static ssize_t i2c_mangle_enable_show | ||||
|   (struct device *dev, struct device_attribute *attr, char *page) | ||||
| { | ||||
| 	return sprintf(page, "%u\n", i2c_mangle_enable); | ||||
| } | ||||
|  | ||||
| static ssize_t i2c_mangle_enable_store | ||||
|   (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | ||||
| { | ||||
| 	int val = 0; | ||||
| 	if (sscanf(buf, "%u", &val) != 1) | ||||
| 		return -EINVAL; | ||||
| 	i2c_mangle_enable = val; | ||||
| 	return count; | ||||
| } | ||||
|  | ||||
| static DEVICE_ATTR(i2c_mangle_enable, 0644, | ||||
| 		   i2c_mangle_enable_show, | ||||
| 		   i2c_mangle_enable_store); | ||||
|  | ||||
| static ssize_t i2c_mangle_debug_show | ||||
|   (struct device *dev, struct device_attribute *attr, char *page) | ||||
| { | ||||
| 	return sprintf(page, "%u\n", i2c_mangle_debug); | ||||
| } | ||||
|  | ||||
| static ssize_t i2c_mangle_debug_store | ||||
|   (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | ||||
| { | ||||
| 	int val = 0; | ||||
| 	if (sscanf(buf, "%u", &val) != 1) | ||||
| 		return -EINVAL; | ||||
| 	i2c_mangle_debug = val; | ||||
| 	return count; | ||||
| } | ||||
|  | ||||
| static DEVICE_ATTR(i2c_mangle_debug, 0644, | ||||
| 		   i2c_mangle_debug_show, | ||||
| 		   i2c_mangle_debug_store); | ||||
|  | ||||
| static ssize_t stv6120_gain_show | ||||
|   (struct device *dev, struct device_attribute *attr, char *page) | ||||
| { | ||||
| 	return sprintf(page, "%u\n", stv6120_gain); | ||||
| } | ||||
|  | ||||
| static ssize_t stv6120_gain_store | ||||
|   (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | ||||
| { | ||||
| 	int val = 0; | ||||
| 	if (sscanf(buf, "%u", &val) != 1) | ||||
| 		return -EINVAL; | ||||
| 	stv6120_gain = val; | ||||
| 	return count; | ||||
| } | ||||
|  | ||||
| static DEVICE_ATTR(stv6120_gain, 0644, | ||||
| 		   stv6120_gain_show, | ||||
| 		   stv6120_gain_store); | ||||
|  | ||||
| static void sysfs_create_entries(void) | ||||
| { | ||||
| 	struct kobject *kobj = &i2c_adapter0->dev.kobj; | ||||
|  | ||||
| 	sysfs_create_file(kobj, &dev_attr_i2c_mangle_enable.attr); | ||||
| 	sysfs_create_file(kobj, &dev_attr_i2c_mangle_debug.attr); | ||||
| 	sysfs_create_file(kobj, &dev_attr_stv6120_gain.attr); | ||||
| } | ||||
|  | ||||
| static void sysfs_remove_entries(void) | ||||
| { | ||||
| 	struct kobject *kobj = &i2c_adapter0->dev.kobj; | ||||
|  | ||||
| 	sysfs_remove_file(kobj, &dev_attr_i2c_mangle_enable.attr); | ||||
| 	sysfs_remove_file(kobj, &dev_attr_i2c_mangle_debug.attr); | ||||
| 	sysfs_remove_file(kobj, &dev_attr_stv6120_gain.attr); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| int init_module(void) | ||||
| { | ||||
| 	i2c_adapter0 = i2c_get_adapter(0); | ||||
| 	if (i2c_adapter0 == NULL) { | ||||
| 		printk(KERN_ERR "i2c_mangle: unable to find adapter 0\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 	sysfs_create_entries(); | ||||
| 	i2c_transfer_mangle = i2c_transfer_axe; | ||||
| 	printk(KERN_INFO "I2C-Bus AXE mangle module loaded\n"); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| void cleanup_module(void) | ||||
| { | ||||
| 	sysfs_remove_entries(); | ||||
| 	i2c_transfer_mangle = NULL; | ||||
| 	i2c_put_adapter(i2c_adapter0); | ||||
| } | ||||
|  | ||||
| MODULE_AUTHOR("Jaroslav Kysela"); | ||||
| MODULE_DESCRIPTION("I2C-Bus AXE mangle module"); | ||||
| MODULE_LICENSE("GPL"); | ||||
		Reference in New Issue
	
	Block a user