Модуль ядра портит память

Модератор: Модераторы разделов

amina100
Сообщения: 6

Модуль ядра портит память

Сообщение amina100 »

Код: Выделить всё

//port[0x90c00000 + 0x54] =  (port[0x90c00000 + 0x54] & 0xfffc3fff) | 0x28000
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>
#include <linux/ioport.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("root");
MODULE_DESCRIPTION("Video sensor initialization");
MODULE_VERSION("0.01");

unsigned long virtual_base = 0;
// address
unsigned long base = 0x90c00000 + 0x54;
// value
u32 value = (0x0 & 0xfffc3fff) | 0x28000;

static int __init sensor_init_start(void) {
        void *address=0;

        virtual_base = (unsigned long) ioremap(base, 4);
        address=(void *)virtual_base;

        iowrite32(value,address);
        wmb();

        return 0;
}

static void __exit sensor_init_end(void) {
}

module_init(sensor_init_start);
module_exit(sensor_init_end);
версия ядра: 3.3.0
архитектура: armv5te

Перед insmod модуля в ядро - spi флэшка читается нормально (cat /dev/mtdblock1)
После - cat /dev/mtdblock1 зависает, в dmesg - timeout
Может, этот код как-то портит память?
Спасибо сказали:

Аватара пользователя
Aliech
Сообщения: 523
ОС: Gentoo arm64 musl hardened

Re: Модуль ядра портит память

Сообщение Aliech »

Тут такое дело... этот код может портить что угодно. Потому что он что-то пишет куда-то в память. Тут надо смотреть, в те ли адреса пишет. Это можно сделать, только полистав спеку на контроллер и плату, где он стоит.

Есть шанс того, что всё нормально с кодом (большой достаточно). Возможно у вас кривой device tree для платы. И там как-то криво описаны устройства, так что при работе камеры отмирает флешка. Так бывает.

Опять таки не понятно, насколько ваш linux 3.3.0 вообще linux. Китайцы разрабатывающие очередной arm чип, не желающие работать с сообществом, обычно ни то, чтобы спеки открыть не могут, они патчи вменяемые написать и заслать разработчикам ядра не удосуживаются. Возможно ваше ядро - есть адовый велосипед из специфичных изменений, который в принципе хорошо не работает. Никогда.

Ну и, самое вероятное, вы после инициализации нечто интенсивно пишете в ту самую флешку. И она тупо не доступна. Или arm-контроллер такой слабый, что при работающей камере не может больше никакой ввод-вывод. Возможно это усугублено предыдущим абзацем.
С уважением, Zerg
Спасибо сказали:

amina100
Сообщения: 6

Re: Модуль ядра портит память

Сообщение amina100 »

Aliech писал:
16.12.2019 02:09
Тут такое дело... этот код может портить что угодно. Потому что он что-то пишет куда-то в память. Тут надо смотреть, в те ли адреса пишет. Это можно сделать, только полистав спеку на контроллер и плату, где он стоит.

Есть шанс того, что всё нормально с кодом (большой достаточно). Возможно у вас кривой device tree для платы. И там как-то криво описаны устройства, так что при работе камеры отмирает флешка. Так бывает.

Опять таки не понятно, насколько ваш linux 3.3.0 вообще linux. Китайцы разрабатывающие очередной arm чип, не желающие работать с сообществом, обычно ни то, чтобы спеки открыть не могут, они патчи вменяемые написать и заслать разработчикам ядра не удосуживаются. Возможно ваше ядро - есть адовый велосипед из специфичных изменений, который в принципе хорошо не работает. Никогда.

Ну и, самое вероятное, вы после инициализации нечто интенсивно пишете в ту самую флешку. И она тупо не доступна. Или arm-контроллер такой слабый, что при работающей камере не может больше никакой ввод-вывод. Возможно это усугублено предыдущим абзацем.
1 - Этот код я написал, основываясь на реверс-инжиниринге китайского бинарника, и в нем всё работает. Адреса там именно такие, и память не портится
2 - Есть SDK (GrainMedia GM8136)
3 - Нет, не пишу, она даже не примонтирована.
4 - После инициализации китайским бинарником флэшка работает нормально, без фризов
5 - datasheet на SoC 686 страниц... так лень читать)) А для сенсора - SmartSens SC2135 даташита нет вообще (по крайней мере мне не удалось его найти)
Спасибо сказали:

Аватара пользователя
Aliech
Сообщения: 523
ОС: Gentoo arm64 musl hardened

Re: Модуль ядра портит память

Сообщение Aliech »

amina100, тогда берите SDK (как пример), берите даташит на чип (так как строчки кода в SDK - это одно, а описание регистров - это несколько другое, и вперёд проверять то, что вам гидра отреверсила...

Ну и совсем простой вопрос:
amina100 писал(а):
16.12.2019 02:29
осле инициализации китайским бинарником
это модуль у вас там обозван "бинарником", али целое ядро?

Просто если у вас китайское ядро всё нормально инициализирует, а потом, когда собираете своё из sdk и добавляете модуль из того ядра в виде разреверсенного кода, то там может быть что угодно. Как угодно.

UPD: понятно, что лень читать. Но там регистры. Это обычно всё специфично весьма. "бит со сдвигом сюда, бит туда... ой, почему вместо лампочки загорелся порт lan и пошёл дым?!"
С уважением, Zerg
Спасибо сказали:

amina100
Сообщения: 6

Re: Модуль ядра портит память

Сообщение amina100 »

Aliech писал:
16.12.2019 02:38
это модуль у вас там обозван "бинарником", али целое ядро?

Просто если у вас китайское ядро всё нормально инициализирует, а потом, когда собираете своё из sdk и добавляете модуль из того ядра в виде разреверсенного кода, то там может быть что угодно. Как угодно.
Нет, это именно бинарник) ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, stripped
Он делает ioctl к драйверу regctl (тоже модуль ядра, к нему нет исходников. Его тоже реверсить пришлось), который и настраивает регистры
Спасибо сказали:

Аватара пользователя
Aliech
Сообщения: 523
ОС: Gentoo arm64 musl hardened

Re: Модуль ядра портит память

Сообщение Aliech »

Ну тогда вперёд, сверять SDK, даташит и данный код. Быстрых путей нет.
С уважением, Zerg
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8255
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

Re: Модуль ядра портит память

Сообщение serzh-z »

amina100 писал(а):
16.12.2019 01:22
Может, этот код как-то портит память?
Уберите запись iowrite32 и проверьте. Вообще, барьер явно должен между ioremap и iowrite32, а не в конце.
Последний раз редактировалось serzh-z 16.12.2019 03:53, всего редактировалось 1 раз.
Спасибо сказали:

amina100
Сообщения: 6

Re: Модуль ядра портит память

Сообщение amina100 »

Код: Выделить всё

//port[0x90c00000 + 0x54] =  (port[0x90c00000 + 0x54] & 0xfffc3fff) | 0x28000
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/io.h>
#include <linux/ioport.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("root");
MODULE_DESCRIPTION("Video sensor initialization");
MODULE_VERSION("0.01");

static int __init sensor_init_start(void) {
        void __iomem *regs = ioremap(0x90c00054, 4);
        u32 reg = readl(regs);
        writel((reg & 0xfffc3fff) | 0x28000, regs);
        iounmap(regs);

        return 0;
}

static void __exit sensor_init_end(void) {
}

module_init(sensor_init_start);
module_exit(sensor_init_end);
Переписал код, всё работает, память не портится, в SDK и даташиты лезть не пришлось
Интересно, в чём была ошибка в предыдущем коде?)
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8255
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

Re: Модуль ядра портит память

Сообщение serzh-z »

amina100 писал(а):
16.12.2019 03:52
Интересно
Значения регистров теперь не затираются, а обновляются.
Спасибо сказали:

amina100
Сообщения: 6

Re: Модуль ядра портит память

Сообщение amina100 »

А барьер в новой версии кода нужен? Или можно и так оставить? Если нужен, до или после writel?
Спасибо сказали:

Kopilov
Сообщения: 812
ОС: [K]Ubuntu, Debian

Re: Модуль ядра портит память

Сообщение Kopilov »

Для не-железячнков, что такое «барьер»?
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8255
Статус: Маньяк
ОС: Arch, CentOS, Ubuntu

Re: Модуль ядра портит память

Сообщение serzh-z »

amina100 писал(а):
16.12.2019 04:18
А барьер в новой версии кода нужен?
readl/writel сами его ставят.

Впрочем, я был неправ по поводу барьера после ioremap - там все правильно было, судя по всему.
Добавлено (19:21):
Kopilov писал:
16.12.2019 11:45
Для не-железячнков, что такое «барьер»?
Запрет переупорядочивания операций ввода-вывода в целях оптимизации. По сути - отключение кеширования между ними.
Последний раз редактировалось serzh-z 16.12.2019 21:15, всего редактировалось 1 раз.
Спасибо сказали:

amina100
Сообщения: 6

Re: Модуль ядра портит память

Сообщение amina100 »

Спасибо всем за помощь :)
Спасибо сказали: