Перейти к содержанию
    

gormih

Свой
  • Постов

    431
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные gormih


  1. Обращаюсь к гуру эмбеддед систем

    Малина незаметно уходит в историю. Появились новые вкусности

    http://otladka.com.ua/index.php?option=com...0&Itemid=71

     

    Все что касается аппаратного развертывания системы, состава учебного компьютера и возможного расширения на основе рессурса на борту прошу писать сюда. Я со своей строны буду делиться достижениями (после того как куплю и соберу). Огрчило отсутствие JTAG, как способ более глубокого изучения.

     

    Прошу сообщить, какую среду лучше всего взять за основу. Заранее спасибо!

    JTAG нужен пригодится разве что для отладки загрузчика, такого как U-boot. После запуска ядра в 99% случаев для отладки вполне достаточно printk и debug level.

    Рабочую машину - рекомендую на базе ubuntu linux 12.04 64 bit. Чем мощнее процессор, тем лучше.

  2. буду пробовать свои задумки на старом ядре. Оставлю в покое 3ю версию, пока разберусь в этом тёмном ящике (ядро Linux), уже глядишь и 4 выйдет с новыми фичами... а задачи надо решать сегодня.

    По опыту: Пока сам не напишешь пару драйверов на имеющееся в наличии рабочее ядро - о портировании новой версии ядра на свою борду думать рановато :-)

  3. Всем добрый день.

    Возникла необходимость в подключении резистивного тачскрина к BeagleBone Black c ОС Android.

    Подключил я его к выводам AIN0...AIN3. Собрал и прошил Android в соответствии с этим руководством: http://processors.wiki.ti.com/index.php/TI..._DeveloperGuide

    Попутно проверил подключен ли драйвер ADC и Touchscreen с помощью этих руководств http://processors.wiki.ti.com/index.php/AM...river%27s_Guide и http://processors.wiki.ti.com/index.php/AM...river%27s_Guide

    Все настройки и содержимое файлов в данной сборке андроида, полностью соответствовали рекомендацим производителя.

    При запуске система запустилась нормально, но папка /sys/bus/iio/devices/ оказалась пустой. Т.е. ADC не заработал и тачскрин координаты нажатия которого, обрабатываются с помощью ADC, соответственно тоже.

    На все обращения, к производителю процессора, либо игнор, либо ответ что в данной сборке все настроено для корректной работы ADC.

     

    Попробовал собрать драйвера ADC и тачскрина в виде подгружаемых модулей. Судя по сообщениям в dmesg, модули загружаются успешно, но устройство ADC в /sys/bus/iio/devices/ не появляется.

    Я в данном деле новичок, подскажите пожалуйста в каком направлении копать. На одном форуме нашел предположение, что надо править Device Tree (am33xx.dtsi и am335x-bone-common.dtsi), но в исходниках ядра Android, таких файлов нет.

    Все нужные вам устройства описываются тут: arch/arm/mach-omap2/board-am335xevm.c

    Для подробного вывода логов нужно подшаманить конфигурацию ядра в части например printk level =7 , и некоторые внести некоторые изменения в самые интересные модули ядра типа #define DEBUG (обязательно до объявления всех .h файлов)

  4. Сам себе задал вопрос, сам и ответил.

    На beagleboneblack Android SDK 4.2.2 имеет следующие соответствия по i2c: В ядре i2c0, на борде i2c-1, i2c1 -> i2c-2 , i2c2-> i2c-3. При этом инициализация i2c-1 -> i2c2 изначально в ядре не прописана, если ваше устройство "висит" на этой шине - ее придется прописать.

  5. Дело оказалось в snd_soc_dai_link am335x_evm_dai

     

     static struct snd_soc_dai_link am335x_evm_dai = {
         .name = "max98088",
          .stream_name = "HiFi",
          .cpu_dai_name ="davinci-mcasp.1",
          .codec_dai_name = "max98088.1-10",
          .platform_name = "davinci-pcm-audio",
          .codec_name = "max98088.1-0010",
          .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF |
                 SND_SOC_DAIFMT_CBM_CFM,
          .ops = &am335x_evm_ops,
      };

    Ключевыми является .stream_name и .codec_dai_name.

    Теперь осталось понять, в каком месте разработчики борды напутали, и какой из трех i2c в ядре выведен на пины отмеченные как i2c-1 :)

  6. - где в ядре задаётся machine id?

    Вы не поверите - как правило в файле борды:-)

    пробовал менять его на тот который был в рабочем варианте - безрезультатно....(((

    Там все может быть сложнее завязано. Может, например вычислять по комбинации перемычек на выводах контроллера, и тому подобное...., Куча подводных камней.

    Если задача не стоит сделать универсальный файл борды под целый ряд девайсов - я лично блокирую все функции идентификации борды, дабы не тратить на них время.

    Единственное - нужно понимать, к каким последствиям это может привести например для подключаемых модулей ядра.

    P.S. чем больше углубляюсь в это , тем больше думаю: зачем выдуманы такие сложности?

    Это не сложности. Это стиль программирования :)

    Только по началу тяжело освоить, потом становится легче, когда знаешь минимум того, что должно быть описано... Со временем понимая всю "навороченность" ядра начинаешь наоборот восхищаться некоторым решениям.

    Писать драйвера под linux гораздо проще по сравнению например с windows именно благодаря богатой инфраструктуре того что нужно на уровне ядра, и хорошо продуманным описательным моделям самих драйверов.

    Я вот чистым временем около недели потратил на освоение того, как примерно работает ALSA на уровне ядра, и еще далек от завершения поставленной задачи. Из документации, на скорую руку слепленой жалким подобием doxygen мало что понятно. :) Но из того, что всплыло становится ясно, что при хорошей документации у меня ушло бы максимум 1 день на решение задачи.

  7. Вообщем имеем begleboneblack + max98089 EVKIT

    Висит кодек на i2c-1

    Пишем драйвер для ALSA:

    #include <linux/clk.h>
      #include <linux/platform_device.h>
      #include <linux/module.h>
      #include <sound/core.h>
      #include <sound/pcm.h>
      #include <sound/soc.h>
      
      #include <asm/mach-types.h>
      #include <mach/hardware.h>
      #include <mach/gpio.h>
      #include <plat/mcbsp.h>
      #include <mach/board-am335xevm.h>
      //#include "omap-mcbsp.h"
      //#include "omap-pcm.h"
      #include "davinci-pcm.h"
      #include "davinci-i2s.h"
      #include "davinci-mcasp.h"
      
      
      #include "../codecs/max98088.h"
      
      #define CODEC_CLOCK     12000000
      
      static int am335x_evm_hw_params(struct snd_pcm_substream *substream,
          struct snd_pcm_hw_params *params)
      {
          struct snd_soc_pcm_runtime *rtd = substream->private_data;
          struct snd_soc_dai *codec_dai = rtd->codec_dai;
          struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
          int ret;
          unsigned sysclk = 12000000;
      
          /* ASP1 on DM355 EVM is clocked by an external oscillator */
          if (machine_is_davinci_dm355_evm() || machine_is_davinci_dm6467_evm() ||
              machine_is_davinci_dm365_evm())
              sysclk = 27000000;
      
          /* ASP0 in DM6446 EVM is clocked by U55, as configured by
           * board-dm644x-evm.c using GPIOs from U18.  There are six
           * options; here we "know" we use a 48 KHz sample rate.
           */
          else if (machine_is_davinci_evm())
              sysclk = 12288000;
      
          else if (machine_is_davinci_da830_evm() ||
                      machine_is_davinci_da850_evm())
              sysclk = 24576000;
          /* On AM335X, CODEC gets MCLK from external Xtal (12MHz). */
          else if (machine_is_am335xevm())
      #ifdef CONFIG_MACH_AM335XEVM
              if (am335x_evm_get_id() == EVM_SK)
                  sysclk = 24000000;
              else
      #endif
                  sysclk = 12000000;
      
          else
              return -EINVAL;
          pr_info("MAX98088 EVM snd_soc_dai_set_sysclk\n");
          ret = snd_soc_dai_set_sysclk(codec_dai, 0,
                  CODEC_CLOCK, SND_SOC_CLOCK_IN);
          if (ret < 0) {
              printk(KERN_ERR "MAX98089 can't set codec system clock\n");
              return ret;
          }
      
          ret = snd_soc_dai_set_sysclk(cpu_dai, sysclk, 0,
                      SND_SOC_CLOCK_IN);
          if (ret < 0) {
              printk(KERN_ERR "MAX98089 can't set CPU system clock sysclk\n");
              return ret;
          }
      
          snd_soc_dai_set_sysclk(cpu_dai, sysclk, 0,
                      SND_SOC_CLOCK_IN);
          if (ret < 0) {
              printk(KERN_ERR "MAX98089  can't set CPU system clock sysclk (2)\n");
              return ret;
          }
      
          return 0;
      }
      
      static struct snd_soc_ops am335x_evm_ops = {
          .hw_params = am335x_evm_hw_params,
      };
      
      /* am335x_evm machine dapm widgets */
      static const struct snd_soc_dapm_widget max98088_dapm_widgets[] = {
          SND_SOC_DAPM_HP("Line Out", NULL),
          SND_SOC_DAPM_LINE("Line In", NULL),
          SND_SOC_DAPM_MIC("Mic In", NULL),
      };
      
      static const struct snd_soc_dapm_route audio_map[] = {
          /* Line Out connected to LLOUT, RLOUT */
          {"Line Out", NULL, "LOUT"},
          {"Line Out", NULL, "ROUT"},
      
          {"LLINEIN", NULL, "Line In"},
          {"RLINEIN", NULL, "Line In"},
      
          {"MICIN", NULL, "Mic In"},
      };
      
      /* Digital audio interface glue - connects codec <--> CPU */
      static struct snd_soc_dai_link am335x_evm_dai = {
          .name = "max98088",
          .stream_name = "AIC23",
          .cpu_dai_name ="davinci-mcasp.1",
          .codec_dai_name = "max98088-hifi",
          .platform_name = "davinci-pcm-audio",
          .codec_name = "max98088.1-0010",
          .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_NB_NF |
                 SND_SOC_DAIFMT_CBM_CFM,
      //    .init = &am335x_evm_soc_init,
          .ops = &am335x_evm_ops,
      };
      
      /* Audio machine driver */
      static struct snd_soc_card snd_soc_am335x_evm = {
          .name = "max98088pd",
          .dai_link = &am335x_evm_dai,
          .num_links = 1,
      
          .dapm_widgets = max98088_dapm_widgets,
          .num_dapm_widgets = ARRAY_SIZE(max98088_dapm_widgets),
          .dapm_routes = audio_map,
          .num_dapm_routes = ARRAY_SIZE(audio_map),
      };
      
      static struct platform_device *am335x_evm_snd_device;
      
      static int __init am335x_evm_soc_init(void)
      {
          int ret;
      
      //    if (!machine_is_omapam335x_evm())
      //        return -ENODEV;
          pr_info("MAX98088 EVM SoC init\n");
      
          am335x_evm_snd_device = platform_device_alloc("soc-audio", -1);
          if (!am335x_evm_snd_device) {
              printk(KERN_ERR "MAX98088 Platform device allocation failed\n");
              return -ENOMEM;
          }
          pr_info("MAX98088 EVM platform_set_drvdata ... \n");
          platform_set_drvdata(am335x_evm_snd_device, &snd_soc_am335x_evm);
          pr_info("MAX98088 EVM platform_set_drvdata OK! \n");
          ret = platform_device_add(am335x_evm_snd_device);
          if (ret)
              goto err1;
      
          return 0;
      
      err1:
          printk(KERN_ERR "Unable to add MAX98088 platform device\n");
          platform_device_put(am335x_evm_snd_device);
      
          return ret;
      }
      
      static void __exit am335x_evm_soc_exit(void)
      {
          platform_device_unregister(am335x_evm_snd_device);
      }
      
      module_init(am335x_evm_soc_init);
      module_exit(am335x_evm_soc_exit);
      
      MODULE_AUTHOR("Anuj Aggarwal <[email protected]>");
      MODULE_DESCRIPTION("ALSA SoC OMAP3517 / AM3517 EVM");
      MODULE_LICENSE("GPL v2");

     

    На выходе имеем следующую фигню:

    по dmesg

     

    <7>[ 2.452697] i2c-core: driver [cs4271] registered

    <7>[ 2.452880] i2c-core: driver [da7210-codec] registered

    <7>[ 2.453063] max98088 1-0010: probe

    <7>[ 2.453063] max98088 1-0010: codec register 1-0010

    <7>[ 2.453125] max98088 1-0010: dai register 1-0010 #2

    <7>[ 2.453125] Registered DAI 'HiFi'

    <7>[ 2.453125] Registered DAI 'Aux'

    <7>[ 2.453155] Registered codec 'max98088.1-0010'

    <7>[ 2.453186] i2c-core: driver [max98088] registered

     

    и далее

     

     

    <6>[ 2.458251] MAX98088 EVM SoC init

    <6>[ 2.461791] MAX98088 EVM platform_set_drvdata ...

    <6>[ 2.466796] MAX98088 EVM platform_set_drvdata OK!

    <7>[ 2.472076] soc-audio soc-audio: binding max98088 at idx 0

    <7>[ 2.472106] soc-audio soc-audio: CPU DAI davinci-mcasp.1 not registered

    <7>[ 2.472106] soc-audio soc-audio: CODEC DAI max98088-hifi not registered

    <7>[ 2.472137] soc-audio soc-audio: Registered card 'max98088pd'

    <6>[ 2.472167] ALSA device list:

    <6>[ 2.475250] No soundcards found.

     

    No soundcards found.

     

     

    Хотя бы подскажите, куда копать..

    Еще не пойму одной вещи - у меня вроде .ops не вызываются, и кодек не пишет отладочных собщений,

    хотя #define DEBUG в нем поставил, уровень отладки kprint 7, и есть еще живительное CFLAGS_max98088.o = -DDEBUG в Makefile. После всего этого отладочных сообщений нету..

     

    P.S.: Скрыть под спойлер код не удалось. Что то не работает на форуме, сори.

  8. 3. Имеется ли в MSP430 файл проекта, в котором указывается какие файлы исходников включены в проект?

    4. Где обычно находится первая вызываемая функция (например, Main) и как она называется?

    Какой вопрос, такой и ответ.

    MSP430 наплевать на файлы проекта, он тупо исполняет бинарный код.

    А вот файл проекта сильно зависит от среды, в которой проект разрабатывался.

    Если, например это gcc binutils + Eclipse, то вообще файл проекта не включает в себя список исходников.

    Если это Keil uVision или например CodeComposer - ситуация резко меняется.

    Вопрос о функции Main в данном случае сугубо риторический... с соответствующим ответом - "где то":-)

  9. Вот толкьо diff тут не совсем мне подходит. так как файлы борды бывают разбитыми на несколкьо фйлов (для моей платы по умолчанию конфигурация борды задаётся в dboard_da850_evm.c и в board_da850_sdi.c)

    Если что, то -

     

    diff -u ./kernel-3.14.1/ ./kernel-2.6.36/ >kernel-from-2636-to-3141.patch

     

    Сделает патч на все ядро целиком. Это для справки.

    Аналогичный патч можно сделать например на всю директорию arch/arm/plat-omap и sound/soc/omap - именно там основные отличия в части исходников интересных по Вашей теме.

     

     

    Сейчас удалось собрать ядро новой версии с исправленым файлом борды, то u-boot пишет :

     

    Uncompressing Linux... done, booting the kernel.

     

    и тишина.....

     

    Конфигурацию u-boot не меняли?

    Такое бывает еще, когда например в u-boot не задана ttys, а в ядре по умолчанию не прописана, либо прописана но не правильно.

    И на всякий случай дайте вывод

    file ./uImage

  10. в новом SDK под мою плату файла нет, так как мою плату делал стороний разработчик и делал файл борды из файла для board_da850_evm.c

    Как вариант:

    1) Находим любую борду под omap, которая есть в старой и новой версии SDK

    2) Делаем diff

    3) По примеру патча делаем патч/исправление под свою борду.

  11. Сейчас столкнулся с такой проблемой, имелся у меня старый SDK именно под мою плату на OMAP-L138. Использовался Linux 2.6.39

    Теперь скачал SDK с ядром 3.3, но конфиг и файл борды используется для omapl138-lcdk от TI

     

    Я попытался выдрать файл борды из старого SDK и подсунуть новому ядру. Ничего не вышло. На этапе сборки я получил кучу ошибок.

     

    Буду рад любым рекомендациям по исправлению файла борды.

    Все правильно, версии не совместимы.

    Придется править почти всё.

    А в новом SDK что, нет под Вашу плату файла? TI очень любят объеденять в один файл кучу процов и плат. Под OMAP там целая директория в arch/arm - поройтесь...

  12. Вы бы не могли пояснить, почему в данном случае (*) не подходит

    Потому что не все модули ядра поддерживают статический режим загрузки.

    Для начала его нужно пробывать загрузить через modprobe, и лишь потом при особом желании делать статическим.

    и причем здесь spinlock?

    Забудьте :-) Это к слову. Я же не знаю, откуда Вы пытаетесь писать в регистры.

  13. Включено как (*).

    Так не пойдет. Сделайте (М)

    Я еще не могу понять, почему контроллер никак не реагирует на запись битов в управляющий регистр... Как переключать режимы работы на лету?

    Вам не помешало бы изучить архитектуру ядра, в том числе что такое spinlock и.т.д. Для начала. Рекомендую книгу Роберата Лава. ISBN 5-8459-1085-1

  14. Ну я же написал, что нужно хотя бы сделать рабочий СОМ-порт... Понять, как из линукс-устройства сделать девайс.

    Ну в данном случае я бы делал так:

    1) Через конфиг ядра нашел бы, какие модули в него добавились.

    2) В эти модули понатыкал побольше диагностических kprint

     

    И еще вопрос - там у вас это serial модулем включено в ядро? (M) или (*) ?

  15. задача запустить как девайс, чтобы при подключении к компутеру хотя бы работал как виртуальный ком-порт (программа минимум).

    Можно пояснить? Что хочется добиться в конечном итоге? Сделать любой абы-какой usb-device, который лишь бы определялся в другой системе?

  16. Самое большее, на что можно расситывать, это сделать проект из кубиков у асушников, которые специализируются на такой тематике.

    Тут по моему других вариантов не предвидится :-)

  17. Доброго времени суток!

    Все же хотелось бы решить эту проблему, не могли бы мне помочь с этим делом?

    Дело в том, что при прошивки МК никак не реагирует на это дело

    Что мешает воспользоваться отладкой на "железе"?

    В AVR STUDIO прекрасный интерфейс, показывающий состояние любого регистра в любой момент времени и точки останова. Этого вполне достаточно для отладки любой сложности.

    Если "ничего не выводит" - первое, что приходит на ум - поставить точку останова в функции void TxChar(char ch), и проанализировать состояние регистров контроллера во время ее работы, если она вообще вызывается.

    Если с регистрами норма - ищите проблемы в железе. Подключите осциллограф или логический анализатор на uart, посмотрите как дергаются / не дергаются пины.

    Причин может быть много - от ошибки в коде, до сгоревшего пина котроллера/ драйвера на плате, и здесь могут дать только советы а не выполнить за Вас работу:)

  18. В таких случах действует стандартный принцип презумпции невиновности, поэтому в бездоказательном варианте эти слова означают оскорбления. А вот наличие флуда проверятся легко, тем более что флудерастом обычно называют за самые последние сообщения, а не годовой давности. Т.е. модераторы разруливают ситуации, сложившиеся именно на форуме, не включая сюда личную жизнь или биографию пользователей. Поэтому правомерность употребления слава "флудераст" входит в компетенцию модератора и может быть разрешено в тех случаях, когда использовано уместно.

    Любое упоминание личных качеств (любых) собеседника как правило ведет к флейму . Применение слова "флудераст" практически неминуемо ведет к флейму. Это я Вам сообщаю, как модератор с 5летним стажем (не этого форума, к счастью).

  19. Так же и в случае слова "педераст" - оно тоже формально не является ругательством, если обращено к гею, но является ругательством, если используется в отношении того, кто не подавал повода заподозрить себя в гомосексуализме. Т.е. тут полная аналогия с традиционным употреблением слов типа "сопливый" и "вонючий". Они тоже могут стать ругательствами, если ими называть невпопад.

    Ксения, я Вас начинаю бояться.

    Откуда Вы с полной достоверностью можете утверждать - является ли пользователь форума геем или нет?

    Предвосхищая Ваш ответ сразу же - если не можете сказать, то на каком основании Вы сможете утверждать, что слово "флудераст" или "педераст" не будет для него являться оскорблением?

    Получается, что оснований нет, а вывод делается, и меры принимаются/ не принимаются, так?

×
×
  • Создать...