Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Драйверы для OpenWRT

Вы не вошли.

 Поиск | Регистрация | Вход 

23.01.2018 13:28:58
#1

Участник
Здесь с 23.01.2018
Сообщений: 3

Драйверы для OpenWRT

Добрый день.

Драйверы Lcomp для Linux под Ubuntu скомпилировались без проблем, но при попытке компиляции под OpenWrt вылезают ошибки:

/home/iham/OpenWRT/L-card/ldevpciu.c: In function 'ldevpci_ioctl':
/home/iham/OpenWRT/L-card/ldevpciu.c:406:7: error: case label does not reduce to an integer constant
       case DIOC_GET_PARAMS:
/home/iham/OpenWRT/L-card/ldevpciu.c:413:7: error: case label does not reduce to an integer constant
       case DIOC_READ_FLASH_WORD:
/home/iham/OpenWRT/L-card/ldevpciu.c:421:7: error: case label does not reduce to an integer constant
       case DIOC_WRITE_FLASH_WORD:

и т.д.

Я так понимаю компилятору не нравится, что в case стоит НЕ integer constant. Декларация макросов в ioctl.h выглядит так:

#define DIOC_GET_PARAMS      _IOWR(0x97, 23, IOCTL_BUFFER)
#define DIOC_READ_FLASH_WORD     _IOWR(0x97, 27, IOCTL_BUFFER)
#define DIOC_WRITE_FLASH_WORD   _IOWR(0x97, 28, IOCTL_BUFFER)

Можно, конечно, переписать весь код в if-else, но может быть существует способ обойтись малой кровью?

23.01.2018 14:46:45
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Драйверы для OpenWRT

а OpenWRT с какими опциями собирает? Это может лезет если свежий gcc и опции типа С99 С11 при сборке заданы... в этих макросах sizeof есть и видимо он это дает. с опцией С90 наверное соберет нормально.

24.01.2018 12:43:10
#3

Участник
Здесь с 23.01.2018
Сообщений: 3

Re: Драйверы для OpenWRT

Изначально вообще никаких опций задано не было. Но и с C90 имеем тоже самое. Получившийся Makefile.

OPENWRT = ${HOME}/OpenWRT/openwrt1505

KERNEL = ${OPENWRT}/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7628/linux-3.18.29
LD=${OPENWRT}/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-uclibc-ld
CROSS_COMPILE="mipsel-openwrt-linux-uclibc-"
KBUILD_HAVE_NLS=no
CONFIG_SHELL="/bin/bash" 




DEBUG=y

# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.


ifeq ($(DEBUG),y)
 DEBFLAGS = -O -g -fno-builtin-memcpy -DLCARD_DEBUG
else
 DEBFLAGS = -O2
endif

EXTRA_CFLAGS+= $(DEBFLAGS)  

ifeq ($(KERNELRELEASE),)

    # Assume the source tree is where the running kernel was built
    # You should set KERNELDIR in the environment if it's elsewhere
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    # The current directory is passed to sub-makes as argument
    PWD := $(shell pwd)

modules:

#
# Make здесь
#
make -C ${KERNEL} ARCH="mips" CC="${OPENWRT}/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-uclibc-gcc -std=c90"  M=$(PWD) modules
#
#
#
		
	#$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

#modules_install:
#	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
cln:
	rm -rf *.o *~ core .depend .*.cmd *.mod.c .tmp_versions

.PHONY: modules modules_install clean

else
	ldevusb-objs = e2010.o e140.o e440.o e154.o ldevusbu.o
	ldevpci-objs = l760.o ldevpciu.o
	ldevpcibm-objs = l791.o ldevpcib.o
	# called from kernel build system: just declare what our modules are
	obj-m += ldevice.o
	obj-m += ldevpci.o
	obj-m += ldevusb.o
	obj-m += ldevpcibm.o
endif
24.01.2018 13:56:04
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Драйверы для OpenWRT

А какая версия ядра и для какой архитектуры процессора собираете?

24.01.2018 14:11:00
#5

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Драйверы для OpenWRT

А, понял. По логам у Вас mips.
Соответственно макрос _IOC_SIZEBITS у Вас равен 13, а не 14 (как на x86/amd64): http://elixir.free-electrons.com/linux/ … ioctl.h#L5
Соответственно макс. размер для буфера данных в IOCTL - 8192, а IOCTL_BUFFER в lcomp больше этого размера, и _IOC_TYPECHECK, который входит в макросы определения кодов IOCTL (http://elixir.free-electrons.com/linux/ … ioctl.h#L8) у Вас дает ссылку на __invalid_size_argument_for_IOC, что не является константой.

Чем именно это ограничение обосновано на MIPS я не знаю, но судя по всему единственный вариант - это уменьшать IOCTL_BUFFER (правда тогда нужно убедиться, что драйвер нигде не использует его полностью в старом размере). И if тут не помогут, т.к. это защита от неправильного размера параметра ioctl сработала. Сообщение конечно малоинформативно при компиляции....

24.01.2018 14:11:58
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,293

Re: Драйверы для OpenWRT

А еще MIPS может быть big-endian. Я не разработчик lcomp, не знаю насколько он это учитывает...
Хотя насчет big-endian - ошибся, mipsel - это little-endian - с порядком байт в слове по крайней мере проблем не должно быть.

Отредактировано Алексей L Card (24.01.2018 15:01:57)

24.01.2018 15:03:57
#7

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Драйверы для OpenWRT

проверить в этом ли дело просто - в объявлении структуры IOCTL_BUFFER уменьшить оба массива до 2048 например.
Но если так соберется, то надо будет смотреть и править  еще библиотеку. Функции типа Put/Get_PM_Array  уменьшать шаг с 1024 до 512. Загрузку E2010 тоже править... это так на первый взгляд.

24.01.2018 19:47:13
#8

Участник
Здесь с 23.01.2018
Сообщений: 3

Re: Драйверы для OpenWRT

Уменьшение буфферов действительно помогло. Все модули успешно скомпилировались. Буду копать файл моего модуля на предмет функций put/get_array.
Благодарю за помощь, а также отдельно за разъяснение, почему так происходит.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск