2

У меня есть исходники ядра встроенного Linux-бокса (в частности, QNAP NAS), на котором работает 64-битное ядро Linux v3.12.6 вместе с файлами конфигурации ядра.

То, что я пытаюсь сделать, это добавить поддержку DVB к этому ядру, добавив модули ядра, которые затем я могу добавить в систему с помощью insmod. Однако, используя эту версию, я не могу скомпилировать dvb-core.ko, который доступен только встроенным (т.е. CONFIG_DVB_CORE = y вместо CONFIG_DVB_CORE = m).

Я посмотрел на файл конфигурации, который связан с моей блочной моделью, и там не установлены переключатели конфигурации DVB:

# cat ../../kernel_cfg/TS-X53/linux-3.12.6-x86_64-hal.cfg | grep DVB
# CONFIG_DVB_DUMMY_FE is not set

Поэтому я скопировал этот файл как .config в каталог исходных кодов ядра и запустил make menuconfig. Я проверил вариант:

Device Drivers -> Multimedia Support -> Digital TV Support

Невозможно нажать M на этой линии, поэтому я нажал Y ; и после его включения, если я ищу DVB_CORE (используя клавишу / ), я получаю:

---------------------------- Search Results -----------------------------
| Symbol: DVB_CORE [=y]                                                 |  
| Type  : tristate                                                      |  
|   Defined at drivers/media/Kconfig:117                                |  
|   Depends on: MEDIA_SUPPORT [=y] && MEDIA_DIGITAL_TV_SUPPORT [=y]     |  
|   Selects: CRC32 [=y]                                                 |
-------------------------------------------------------------------------

Поэтому, если затем я включаю различные драйверы тюнера в качестве модуля (например, dvb-usb-dib0700.ko), сохраняю, завершаю и запускаю make-модули, я получаю все файлы .ko тюнера, но не dvb-core.ko, который необходимо, чтобы моя система загружала другие зависимые файлы .ko . Это переключатели конфигурации после выхода:

# cat .config | grep DVB
CONFIG_DVB_CORE=y
CONFIG_DVB_NET=y
CONFIG_DVB_MAX_ADAPTERS=8
# CONFIG_DVB_DYNAMIC_MINORS is not set
CONFIG_DVB_USB=m
# CONFIG_DVB_USB_DEBUG is not set
# CONFIG_DVB_USB_A800 is not set
# CONFIG_DVB_USB_DIBUSB_MB is not set
# CONFIG_DVB_USB_DIBUSB_MC is not set
CONFIG_DVB_USB_DIB0700=m
# CONFIG_DVB_USB_UMT_010 is not set
# CONFIG_DVB_USB_CXUSB is not set
# CONFIG_DVB_USB_M920X is not set
# CONFIG_DVB_USB_DIGITV is not set
# CONFIG_DVB_USB_VP7045 is not set
# CONFIG_DVB_USB_VP702X is not set
# CONFIG_DVB_USB_GP8PSK is not set
# CONFIG_DVB_USB_NOVA_T_USB2 is not set
# CONFIG_DVB_USB_TTUSB2 is not set
# CONFIG_DVB_USB_DTT200U is not set
# CONFIG_DVB_USB_OPERA1 is not set
# CONFIG_DVB_USB_AF9005 is not set
# CONFIG_DVB_USB_PCTV452E is not set
# CONFIG_DVB_USB_DW2102 is not set
# CONFIG_DVB_USB_CINERGY_T2 is not set
# CONFIG_DVB_USB_DTV5100 is not set
# CONFIG_DVB_USB_FRIIO is not set
# CONFIG_DVB_USB_AZ6027 is not set
# CONFIG_DVB_USB_TECHNISAT_USB2 is not set
# CONFIG_DVB_USB_V2 is not set
# CONFIG_DVB_TTUSB_BUDGET is not set
# CONFIG_DVB_TTUSB_DEC is not set
# CONFIG_DVB_B2C2_FLEXCOP_USB is not set
# DVB-S (satellite) frontends
# DVB-T (terrestrial) frontends
CONFIG_DVB_DIB3000MC=m
CONFIG_DVB_DIB7000M=m
CONFIG_DVB_DIB7000P=m
# DVB-C (cable) frontends
CONFIG_DVB_LGDT3305=m
CONFIG_DVB_S5H1411=m
CONFIG_DVB_DIB8000=m
CONFIG_DVB_TUNER_DIB0070=m
CONFIG_DVB_TUNER_DIB0090=m
# SEC control devices for DVB-S
# CONFIG_DVB_DUMMY_FE is not set

Если я отредактирую файл .config вручную и поставлю CONFIG_DVB_CORE = m save, а затем добавлю модули, ничего не изменится:

# make modules
scripts/kconfig/conf --silentoldconfig Kconfig
#
# configuration written to .config
#
make[1]: Nothing to be done for `relocs'.
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  Building modules, stage 2.
  MODPOST 195 modules

Dvb-core.ko все еще не скомпилирован, и также установка отменена:

# cat .config | grep DVB_CORE
CONFIG_DVB_CORE=y

Итак, мой вопрос: как я могу скомпилировать dvb-core.ko как модуль ядра?

Имейте в виду, что используя предыдущие исходники ядра, которые использовали ядро 3.4.6, я мог бы легко сделать это с помощью make menuconfig, поскольку там я смог установить M в настройке DVB. Но меню было другим, поскольку DVB был здесь:

Device Drivers -> Multimedia Support -> DVB for Linux

И это было результатом поиска DVB_CORE:

---------------------------- Search Results -----------------------------
| Symbol: DVB_CORE [=m]                                                 |  
| Type  : tristate                                                      |  
| Prompt: DVB for Linux                                                 |  
|   Defined at drivers/media/Kconfig:69                                 |  
|   Depends on: MEDIA_SUPPORT [=y]                                      |  
|   Location:                                                           |  
|     -> Device Drivers                                                 |  
|       -> Multimedia support (MEDIA_SUPPORT [=y])                      |  
|   Selects: CRC32 [=y]                                                 |  
-------------------------------------------------------------------------

И (старый) конфиг переключается:

# cat .config | grep DVB
CONFIG_DVB_CORE=m
CONFIG_DVB_NET=y
CONFIG_VIDEO_BT848_DVB=y
CONFIG_DVB_MAX_ADAPTERS=8
# CONFIG_DVB_DYNAMIC_MINORS is not set
CONFIG_DVB_CAPTURE_DRIVERS=y
CONFIG_DVB_AV7110=m
# CONFIG_DVB_AV7110_OSD is not set
CONFIG_DVB_BUDGET_CORE=m
CONFIG_DVB_BUDGET=m
CONFIG_DVB_BUDGET_CI=m
CONFIG_DVB_BUDGET_AV=m
CONFIG_DVB_BUDGET_PATCH=m
CONFIG_DVB_USB=m
# CONFIG_DVB_USB_DEBUG is not set
CONFIG_DVB_USB_A800=m
CONFIG_DVB_USB_DIBUSB_MB=m
CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
CONFIG_DVB_USB_DIBUSB_MC=m
CONFIG_DVB_USB_DIB0700=m
... cut ...

1 ответ1

1

Видимо, решение было легко применить, но не так легко угадать. Чтобы собрать dvb-core.ko как модуль, мне пришлось вернуться в меню:

Device Drivers -> Multimedia support

Там поддержка мультимедиа уже помечена как Y в файле конфигурации ядра:

<*> Multimedia Support --->

Решение - выбрать поддержку мультимедиа и нажать M, чтобы пометить его как модуль:

<M> Multimedia Support --->

Таким образом, в основном выбор модуля должен быть сделан в родительском меню, в то время как я изначально думал, что это было в поддержке цифрового телевидения. Тогда при поиске DVB_CORE я правильно получаю:

---------------------------- Search Results -----------------------------
| Symbol: DVB_CORE [=m]                                                 |  
| Type  : tristate                                                      |  
|   Defined at drivers/media/Kconfig:117                                |  
|   Depends on: MEDIA_SUPPORT [=m] && MEDIA_DIGITAL_TV_SUPPORT [=y]     |  
|   Selects: CRC32 [=y]                                                 |
-------------------------------------------------------------------------

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .