Программирование DSP

Материал из FRUCT Maemo wiki (Russian)
(Различия между версиями)
Перейти к: навигация, поиск
(Компиляция программы)
(Советы, приемы и устранение проблем)
 
(не показаны 11 промежуточных версий 2 участников)
Строка 47: Строка 47:
 
<code>gen_dummy_kernel</code> используется для генерации пустого ядра, основанного на ядре DSP на планшете (называется <code>avs_kernel.out</code>), на который будут ссылаться любые создаваемые модули, чтобы они выполнялись на устройстве. В результате любые неразрешенные символы и адреса вызова функций должны разрешаться статически, но без необходимости статических ссылок (так как после этого пустое ядро из предыдущего пункта следует удалить). Команда <code>coff_unresolve</code> после этого выполняется в отношении тех модулей, в которых только что были созданы ссылки на пустое ядро, чтобы удалить разделы, связанные ссылками с пустым ядром.  
 
<code>gen_dummy_kernel</code> используется для генерации пустого ядра, основанного на ядре DSP на планшете (называется <code>avs_kernel.out</code>), на который будут ссылаться любые создаваемые модули, чтобы они выполнялись на устройстве. В результате любые неразрешенные символы и адреса вызова функций должны разрешаться статически, но без необходимости статических ссылок (так как после этого пустое ядро из предыдущего пункта следует удалить). Команда <code>coff_unresolve</code> после этого выполняется в отношении тех модулей, в которых только что были созданы ссылки на пустое ядро, чтобы удалить разделы, связанные ссылками с пустым ядром.  
  
Или скопируйте данные инструменты в путь, или настройте <code>dspgw-3.3-dsp/src/apps/demo_mod/Makefile</code>, чтобы использовать инструменты из каталога, в котором они находятся (например, создайте папку для указанных сервисных программ, поместите туда данные файлы и используйте абсолютный путь в файле сборки, например  <code>/usr/local/ti_dsptools/gateway/gen_dummy_kernel</code> и <code>/usr/local/ti_dsptools/gateway/coff_unresolve</code>). Еще одна возможность, чтобы во всех файлах сборки были явные пути использовать сценарий bash, который запускается до выполнения DSP разработки, для установления соответствующих путей.
+
Или скопируйте данные инструменты в системную переменную path, или настройте <code>dspgw-3.3-dsp/src/apps/demo_mod/Makefile</code>, чтобы использовать инструменты из каталога, в котором они находятся. Например, создайте папку для указанных сервисных программ, поместите туда данные файлы и используйте абсолютный путь в файле сборки, например  <code>/usr/local/ti_dsptools/gateway/gen_dummy_kernel</code> и <code>/usr/local/ti_dsptools/gateway/coff_unresolve</code>. Еще одна возможность, чтобы во всех файлах сборки были явные пути – для установления соответствующих путей использовать сценарий bash, который запускается до выполнения DSP разработки.
  
 
Чтобы сформировать демонстрационную консоль (в качестве примера):
 
Чтобы сформировать демонстрационную консоль (в качестве примера):
Строка 63: Строка 63:
 
  make omap1
 
  make omap1
  
Код скомпилирован в объектный файл (<code>*.obj</code>), пустое ядро создано из файла <code>avs_kernel.out</code> при помощи ранее скомпилированной сервисной программы <code>gen_dummy_kernel</code>, в объектном файле есть ссылка на пустое ядро. После этого пустое ядро удаляется из полученного в результате объектного файла при помощи ранее созданной сервисной программы <code>coff_unresolve</code>. В результате остается файл, который называется <code>*.o</code>.
+
Код будет скомпилирован в объектный файл (<code>*.obj</code>), пустое ядро создается из файла <code>avs_kernel.out</code> при помощи ранее скомпилированной утилиты <code>gen_dummy_kernel</code>, в объектном файле есть ссылка на пустое ядро. После этого пустое ядро удаляется из полученного объектного файла при помощи ранее созданной утилиты <code>coff_unresolve</code>. В результате остается файл, который называется <code>*.o</code>.
  
 
==== Инсталляция демонстрационной программы ====
 
==== Инсталляция демонстрационной программы ====
  
После компиляции кода потребуется поместить объектный файл для DSP (<code>*.o</code>) и файл команд редактора связей (<code>*.cmd</code>) в <code>/lib/dsp/modules/</code>. Также понадобится выполнить запись в файле <code>/lib/dsp/dsp_dld_avs.conf</code>, чтобы дать знать DSP о существовании данного модуля.  
+
После компиляции кода потребуется поместить объектный файл для DSP (<code>*.o</code>) и файл команд редактора связей (<code>*.cmd</code>) в <code>/lib/dsp/modules/</code>. Также понадобится выполнить запись в файле <code>/lib/dsp/dsp_dld_avs.conf</code>, чтобы дать DSP знать о существовании данного модуля.  
  
 
<pre>
 
<pre>
Строка 84: Строка 84:
 
</pre>
 
</pre>
  
В таком случае понадобится создать символьную ссылку из фактического файла <code>dsp_dld_avs.conf</code> в ожидаемый файл <code>dsp_dld.conf</code> (оба файла находятся в каталоге <code>/lib/dsp/</code>). После этого повторите попытку и на экран будет выведена следующая информация:
+
В таком случае понадобится создать символьную ссылку (symlink) из фактического файла <code>dsp_dld_avs.conf</code> в ожидаемый файл <code>dsp_dld.conf</code> (оба файла находятся в каталоге <code>/lib/dsp/</code>). После этого повторите попытку и на экран будет выведена следующая информация:
  
 
<pre>
 
<pre>
Строка 102: Строка 102:
 
</pre>
 
</pre>
  
После этого скопируйте бинарный файл для ARM в любом месте на планшете (в любом месте, но не в разделах FAT на картах флеш-памяти, так как для них не активировано выполнение файлов) и выполните его.
+
После этого скопируйте бинарный файл для ARM в любое место на планшете (кроме разделов FAT на картах флеш-памяти, так как для них не активировано выполнение файлов) и выполните его.
  
 
<pre>
 
<pre>
Строка 127: Строка 127:
 
есть проблемы с кодом для DSP. Убедитесь, что была в точности добавлена строка, предложенная ранее, в <code>/lib/dsp/dsp_dld_avs.conf</code>.
 
есть проблемы с кодом для DSP. Убедитесь, что была в точности добавлена строка, предложенная ранее, в <code>/lib/dsp/dsp_dld_avs.conf</code>.
  
==== Компиляция остальных демонстрационных программ ====
+
==== Компиляция остальных демо-программ ====
  
 
При необходимости копировать код из файлов DSP Gateway в формате pdf, необходимо помнить о следующем (а также принять во внимание, что в архиве .tar содержится практически идентичный код, который также можно использовать):
 
При необходимости копировать код из файлов DSP Gateway в формате pdf, необходимо помнить о следующем (а также принять во внимание, что в архиве .tar содержится практически идентичный код, который также можно использовать):
  
 
Любые знаки \ выглядят как ¥ в формате PDF, обычные кавычки ' иногда выходят как совершенно другой знак (автоматические кавычки), поэтому убедитесь, что код проверен, если начинают появляться странные ошибки.
 
Любые знаки \ выглядят как ¥ в формате PDF, обычные кавычки ' иногда выходят как совершенно другой знак (автоматические кавычки), поэтому убедитесь, что код проверен, если начинают появляться странные ошибки.
Также потребуется удалить ссылки на включаемый файл. В демонстрационных программах архива .tar данной строки нет (в остальном они идентичны данным в PDF).
+
Также потребуется удалить ссылки на включаемый файл (include file). В демо-программах архива .tar данной строки нет (в остальном они идентичны данным в PDF).
  
 
=== Прогресс ===
 
=== Прогресс ===
  
Как кажется, вывод видео был прекращен Nokia с появлением N800. Программа DSP стала более стабильной, нет полной уверенности, в чем заключается причина: в том, что не используется буфер кадра или аппаратное обеспечение стало более продуманным. В любом случае, декодирование и вывод аудио все еще выполняется при помощи DSP и это подходящее задание для любителей полностью погрузиться в проблему. Доступ к буферу кадра работает для устройств N8x0 и 770. Для получения более подробной информации предлагается связаться с lardman или прочитать список для разработчиков Maemo. Данная страница будет обновлена.  
+
Как кажется, вывод видео был прекращен Nokia с появлением N800. Программа DSP стала более стабильной. Нет полной уверенности, в чем тому причина - в том, что не используется буфер кадра или аппаратное обеспечение стало более зрелым. В любом случае, декодирование и вывод аудио все еще выполняются при помощи DSP и это подходящее задание для любителей полностью погрузиться в проблему. Доступ к буферу кадра работает для устройств N8x0 и 770. Для получения более подробной информации предлагается связаться с lardman или прочитать список для разработчиков Maemo. Данная страница будет обновлена.  
  
Требуется несколько драйверов, чтобы получить доступ к аудио кодеку (низкоуровневый минидрайвер и стандартный высокоуровневый драйвер). Очевидно, что они уже имеются на устройстве, но отсутствует документация по их непосредственному использованию. На самом деле, можно увидеть по функциям, вызванным существующими модулями (например, <code>pcm2.o</code>), что это потоковый драйвер. Следовательно, может существовать возможность получить доступа к драйверу данного класса напрямую (существует много примеров в DDK, информация предоставлена далее).  
+
Требуется несколько драйверов, чтобы получить доступ к аудио кодеку (низкоуровневый минидрайвер и стандартный высокоуровневый драйвер). Очевидно, что они уже имеются на устройстве, но отсутствует документация по их непосредственному использованию. На самом деле, можно увидеть по функциям, вызванным существующими модулями (например, <code>pcm2.o</code>), что это потоковый драйвер. Следовательно, может существовать возможность получения доступа к драйверу данного класса напрямую (существует много примеров в DDK, информация предоставлена далее).  
  
 
Оказывается, данный потоковый драйвер обернут другими функциональными вызовами (то есть, следующие функции вызываются <code>pcm2.o</code>):
 
Оказывается, данный потоковый драйвер обернут другими функциональными вызовами (то есть, следующие функции вызываются <code>pcm2.o</code>):
Строка 153: Строка 153:
 
</pre>
 
</pre>
  
Данный функции <code>_EAP_*</code> встроены в ядро DSP <code>avs_kernel.out</code>. Было бы полезно иметь заголовочный файл для данных функций и, если возможно, пример кода и/или инструкции, иллюстрирующие их использование.  
+
Данные функции <code>_EAP_*</code> встроены в ядро DSP <code>avs_kernel.out</code>. Было бы полезно иметь заголовочный файл для данных функций и, если возможно, пример кода и/или инструкции, иллюстрирующие их использование.  
 
<br>Полезная информация по написанию драйверов для DSP устройств и использованию функций SIO_* предлагается [http://www.design-reuse.com/articles/6849/how-to-write-dsp-device-drivers.html здесь].
 
<br>Полезная информация по написанию драйверов для DSP устройств и использованию функций SIO_* предлагается [http://www.design-reuse.com/articles/6849/how-to-write-dsp-device-drivers.html здесь].
  
Еще один вариант – написать полностью новый минидрайвер, драйвер класса + реализацию оболочки. В начале это выглядит приемлемым заданием. Для его выполнения требуются [https://www-a.ti.com/downloads/sds_support/targetcontent/ddk/DDK_1_20/index.html DSP/Комплект SDK BIOS Driver 1.20] с примерами и информацией о написании драйверов,  [http://focus.ti.com/docs/toolsw/folders/print/sprc133.html Библиотека поддержки чипа], с которой сопрягается DDK, и информация о самом аппаратном кодеке.  
+
Еще один вариант – написать полностью новый минидрайвер, драйвер класса и реализацию оболочки. В начале это выглядит приемлемым заданием. Для его выполнения требуются [https://www-a.ti.com/downloads/sds_support/targetcontent/ddk/DDK_1_20/index.html DSP/BIOS Driver Developer Kit 1.20] с примерами и информацией по написанию драйверов,  [http://focus.ti.com/docs/toolsw/folders/print/sprc133.html Библиотека поддержки чипа], с которым сопрягается DDK, и информация о самом аппаратном кодеке.  
  
На устройстве 770 кодек называется <code>aic23</code> (обратитесь к выходным данным  <code>dmesg</code>). На устройстве N800 кодек называется <code>TSC2301</code> (часть микросхемы сенсорного экрана) (снова обратитесь к выходным данным <code>dmesg</code> — обратитесь в [http://www.internettablettalk.com/forums/showpost.php?p=30655&postcount=46 данную ветку форума].  
+
На устройстве 770 кодек называется <code>aic23</code> (обратитесь к выходным данным  <code>dmesg</code>). На устройстве N800 кодек называется <code>TSC2301</code> (часть микросхемы сенсорного экрана) (снова обратитесь к выходным данным <code>dmesg</code> — обратитесь в [http://www.internettablettalk.com/forums/showpost.php?p=30655&postcount=46 данную ветку форума]).  
  
 
<pre>
 
<pre>
Строка 164: Строка 164:
 
</pre>
 
</pre>
  
Данные в отношении указанных кодеков предлагаются на стайте Texas Instruments. Обратитесь на страницу для [http://focus.ti.com/docs/prod/folders/print/tsc2301.html TSC2301]. Здесь предлагается перечень технических характеристик с [http://focus.ti.com/lit/ds/symlink/tsc2301.pdf информацией, необходимой для написания  минидрайвера].
+
Данные в отношении указанных кодеков предлагаются на сайте Texas Instruments. Обратитесь на страницу для [http://focus.ti.com/docs/prod/folders/print/tsc2301.html TSC2301]. Здесь предлагается перечень технических характеристик с [http://focus.ti.com/lit/ds/symlink/tsc2301.pdf информацией, необходимой для написания  минидрайвера].
  
К сожалению, нет полной уверенности, что возможно добавить новый минидрайвер без компиляции ядра DSP (обратитесь в главу 3 документа spru616a.pdf в DDK – ссылка предлагалась ранее). Возможно, существует вероятность создания dsptask с драйвером, но снова, полной уверенности нет.  
+
К сожалению, нет полной уверенности, что возможно добавить новый минидрайвер без рекомпиляции ядра DSP (обратитесь в главу 3 документа spru616a.pdf в DDK – ссылка предлагалась ранее). Возможно, существует вероятность создания dsptask с драйвером, но полной уверенности нет.  
  
За более подробной информацией о дизассемблировании обратитесь к данным документам:
+
За более подробной информацией о дизассемблировании обратитесь к документам:
  
 
{| class="wikitable"
 
{| class="wikitable"
Строка 197: Строка 197:
 
  dbg('this is a message, this is a value=%d', some_value);
 
  dbg('this is a message, this is a value=%d', some_value);
  
Обратите внимание, что переменная <code>some_value</code> должна иметь тип short или меньший (16 бит или меньше). Если передается 32 битное число, очень часто возвращается ноль (возможно, в силу странного порядка следования байтов 32 битного типа данных, что означает, что первые 16 битов относятся к старшим байтам). Поэтому разбейте 32 битные данные на 16 битные составляющие (или преобразуйте их, если есть уверенность в ограниченном диапазоне).
+
Обратите внимание, что переменная <code>some_value</code> должна иметь тип short или меньший (16 бит или меньше). Если передается 32 битное число, очень часто возвращается ноль (возможно, в силу странного порядка следования байтов 32 битного типа данных, что означает, что первые 16 битов относятся к старшим байтам). Поэтому разбейте 32 битные данные на 16 битные составляющие (или отбросьте их, если есть уверенность в ограниченности значений).
  
 
==== Расположение данных ====
 
==== Расположение данных ====
  
Были отмечены некоторые трудности при попытке получить доступ к массиву данных, который определен как глобальная константа, ссылающаяся на массив целых чисел. Проблема заключалось в том, что каждый элемент массива возвращал ноль, а не то значение, которое было для него установлено. Исследование вопроса показало, что проблема связана с расположением в памяти данных глобальных констант. Изменение определения с глобальной константы, ссылающейся на массив целых чисел, на простую глобальную константу, ссылающуюся на массив целых чисел, разрешило проблему и был получен доступ к данным.
+
Были отмечены некоторые трудности при попытке получить доступ к массиву global const int. Проблема была в том, что каждый элемент массива возвращал ноль, а не его истинное значение. Исследование вопроса показало, что проблема связана с расположением глобальных констант в памяти. Изменение типа данных с глобальной целой константы (global const int) на просто глобальное целое (global int), разрешило проблему и был получен доступ к данным.  
  
 
Далее данный вопрос не изучался, но в файле <code>avs_kernelcfg.cmd</code> можно увидеть расположения различных частей памяти, и может оказаться, что чтобы получить фактические данные (отличные от нуля), необходимо или использовать far функцию (обратитесь в руководство по DSP для C/C++) или убедиться, что данные находятся в правильном разделе памяти.
 
Далее данный вопрос не изучался, но в файле <code>avs_kernelcfg.cmd</code> можно увидеть расположения различных частей памяти, и может оказаться, что чтобы получить фактические данные (отличные от нуля), необходимо или использовать far функцию (обратитесь в руководство по DSP для C/C++) или убедиться, что данные находятся в правильном разделе памяти.

Текущая версия на 17:02, 7 марта 2010

[править] Программирование DSP

В данной статье кратко описано программирование и использование процессора цифровой обработки сигналов (DSP) на планшетах.

Содержание


[править] Основные источники информации

документация по DSP от TI. Выполните поиск на данной странице на предмет c55 в описании, чтобы получить представляющие интерес документы. Несколько прямых ссылок перечислены в конце данной страницы.

Проект DSP Gateway. Он используется в устройствах Nokia 770, N800 и N810 для сопряжения процессора ARM и DSP.

[править] Настройка toolchain

Получите toolchain на странице Инструменты DSP для Linux от TI (для получения доступа к данной странице необходима бесплатная регистрация). Выберите набор Linux DSP Tools v1.00, загрузите его в /tmp и распакуйте его:

chmod a+rx /tmp/linuxdsptools_v1_00_00_06.bin
/tmp/linuxdsptools_v1_00_00_06.bin 

Выберите каталог для инсталляции в /tmp. После того, как пакет распакован, необходимо его собственно инсталлировать. Убедитесь, что инсталлированы expect (sudo aptitude install expect) и Java. Не пытайтесь инсталлировать инструменты DSP в Scratchbox, так как в этом нет смысла (то есть, это основанный на x86 cross-toolchain для DSP).

Инсталлируйте пакет в /usr/local/ti_dsptools (используйте sudo или убедитесь при помощи какого-то другого способа, что можно выполнить make для каталога):

cd /tmp/Linux-DSP-Tools-1.00.00.06 
./subpkg_install_linuxdsptools.exp /usr/local/ti_dsptools 

Скопируйте avs_kernel.out с устройства (в /lib/dsp/ в настоящее время) в /usr/local/ti_dsptools/dspgw.

Теперь все готово для компиляции (можно попробовать, например, портирование Speex на DSP GW).

Более подробные инструкции представлены в данной ветке.

Можно связаться с пользователем сервиса IRC lardman/написать электронное письмо Саймону Пикерингу (s точка g точка pickering собака bath точка ac точка uk).

[править] Компиляция программы

Получите для DSP Gateway пакеты с исходным кодом со страницы загрузки. Загрузите пакет для ARM (dspgw-3.3-arm.tar.bz2) и пакет для DSP (dspgw-3.3-dsp.tar.bz2). Потребуется версия 3.3(.0), а не версия 3.3.1!

Нет необходимости заниматься внесением исправлений и повторным формированием ядра 770 или специально заниматься ядром DSP, так как они оба уже настроены на использование DSP Gateway.

Распакуйте архивы .tar. Зайдите в 'dspgw-3.3-arm/host_src/mod_utils и сформируйте инструменты coff_unresolve и gen_dummy_kernel, используя собственный toolchain на компьютере (используется для формирования всего, что не связано с ARM). Простой команды make должно быть достаточно.

gen_dummy_kernel используется для генерации пустого ядра, основанного на ядре DSP на планшете (называется avs_kernel.out), на который будут ссылаться любые создаваемые модули, чтобы они выполнялись на устройстве. В результате любые неразрешенные символы и адреса вызова функций должны разрешаться статически, но без необходимости статических ссылок (так как после этого пустое ядро из предыдущего пункта следует удалить). Команда coff_unresolve после этого выполняется в отношении тех модулей, в которых только что были созданы ссылки на пустое ядро, чтобы удалить разделы, связанные ссылками с пустым ядром.

Или скопируйте данные инструменты в системную переменную path, или настройте dspgw-3.3-dsp/src/apps/demo_mod/Makefile, чтобы использовать инструменты из каталога, в котором они находятся. Например, создайте папку для указанных сервисных программ, поместите туда данные файлы и используйте абсолютный путь в файле сборки, например /usr/local/ti_dsptools/gateway/gen_dummy_kernel и /usr/local/ti_dsptools/gateway/coff_unresolve. Еще одна возможность, чтобы во всех файлах сборки были явные пути – для установления соответствующих путей использовать сценарий bash, который запускается до выполнения DSP разработки.

Чтобы сформировать демонстрационную консоль (в качестве примера):

Сформируйте демонстрационную консоль для ARM в dspgw-3.3-arm/apps/demo<c/ode> при помощи <code>make demo_console.

Все это можно выполнить или внутри scratchbox, или сделайте так, чтобы CC в файле сборки указывал на кросс-компилятор arm (например, /scratchbox/compilers/arm-gcc-3.3.4-glibc-2.3.2/bin/arm-linux-gcc).

Получите avs_kernel.out с планшета и поместите в сформированный каталог для DSP (то есть, в каталог, в котором содержится код для выполнения в DSP в dspgw-3.3-dsp/src/apps/demo_mod/). Файл avs_kernel.out находится в каталоге /lib/dsp/.

Настройте файл сборки (например, dspgw-3.3-dsp/src/apps/demo_mod/Makefile), чтобы использовать файл avs_kernel.out для генерации ядра dummy_kernel.obj , а не ядра по умолчанию tinkernel.out (tinkernel – это название, которое используется во всей документации по ядру DSP. Так сложилось, что компания Nokia решила дать файлу ядра другое название. Не нужно специально заниматься исходным кодом ядра tinkernel, найденного при помощи toolchain. Все, что необходимо, это собственно бинарный файл avs_kernel.out с планшета).

Выполните:

make omap1

Код будет скомпилирован в объектный файл (*.obj), пустое ядро создается из файла avs_kernel.out при помощи ранее скомпилированной утилиты gen_dummy_kernel, в объектном файле есть ссылка на пустое ядро. После этого пустое ядро удаляется из полученного объектного файла при помощи ранее созданной утилиты coff_unresolve. В результате остается файл, который называется *.o.

[править] Инсталляция демонстрационной программы

После компиляции кода потребуется поместить объектный файл для DSP (*.o) и файл команд редактора связей (*.cmd) в /lib/dsp/modules/. Также понадобится выполнить запись в файле /lib/dsp/dsp_dld_avs.conf, чтобы дать DSP знать о существовании данного модуля.

# echo "demo_console _task_demo_console 1 /lib/dsp/modules/demo_console.o" >> /lib/dsp/dsp_dld_avs.conf

После этого возникнет необходимость выполнить dsp_dld , чтобы перезапустить DSP и перезагрузить список модулей. Может появиться сообщение, что не найден конфигурационный файл:

Nokia-N800-10:~# dsp_dld
sending SIGBUS signal to all task users...
killing pid 832.
killing pid 827.
killing pid 1582.
Can't open /lib/dsp/dsp_dld.conf

В таком случае понадобится создать символьную ссылку (symlink) из фактического файла dsp_dld_avs.conf в ожидаемый файл dsp_dld.conf (оба файла находятся в каталоге /lib/dsp/). После этого повторите попытку и на экран будет выведена следующая информация:

Nokia-N800-10:~# dsp_dld
sending SIGBUS signal to all task users...
killing pid 4234.
killing pid 4236.
killing pid 4235.
mapping external memory: adr = 0x028000, size = 0x1000
mapping external memory: adr = 0x100000, size = 0x200000
mapping external memory: adr = 0x400000, size = 0x180000
detected binary version 3.3.0.0
setting DSP reset vector to 0x10389e
releasing DSP reset
DSP configuration ...
succeeded.

После этого скопируйте бинарный файл для ARM в любое место на планшете (кроме разделов FAT на картах флеш-памяти, так как для них не активировано выполнение файлов) и выполните его.

Nokia-N800-10:~# ./demo_console
Congratulations! DSP is working!

Сообщение следующего вида:

Nokia-N800-10:~# ./demo_console
open: No such file or directory

означает, что или модуль не был добавлен в файл /lib/dsp/dsp_dld_avs.conf (надлежащим образом), или не было выполнено dsp_dld, чтобы обновить DSP. В обоих случаях устройство /dev/dsptask/ не было создано, так как модуль нельзя было загрузить, отсюда ошибка open.

Если появилось сообщение:

~ $ ./demo_console
open: Interrupted system call

есть проблемы с кодом для DSP. Убедитесь, что была в точности добавлена строка, предложенная ранее, в /lib/dsp/dsp_dld_avs.conf.

[править] Компиляция остальных демо-программ

При необходимости копировать код из файлов DSP Gateway в формате pdf, необходимо помнить о следующем (а также принять во внимание, что в архиве .tar содержится практически идентичный код, который также можно использовать):

Любые знаки \ выглядят как ¥ в формате PDF, обычные кавычки ' иногда выходят как совершенно другой знак (автоматические кавычки), поэтому убедитесь, что код проверен, если начинают появляться странные ошибки. Также потребуется удалить ссылки на включаемый файл (include file). В демо-программах архива .tar данной строки нет (в остальном они идентичны данным в PDF).

[править] Прогресс

Как кажется, вывод видео был прекращен Nokia с появлением N800. Программа DSP стала более стабильной. Нет полной уверенности, в чем тому причина - в том, что не используется буфер кадра или аппаратное обеспечение стало более зрелым. В любом случае, декодирование и вывод аудио все еще выполняются при помощи DSP и это подходящее задание для любителей полностью погрузиться в проблему. Доступ к буферу кадра работает для устройств N8x0 и 770. Для получения более подробной информации предлагается связаться с lardman или прочитать список для разработчиков Maemo. Данная страница будет обновлена.

Требуется несколько драйверов, чтобы получить доступ к аудио кодеку (низкоуровневый минидрайвер и стандартный высокоуровневый драйвер). Очевидно, что они уже имеются на устройстве, но отсутствует документация по их непосредственному использованию. На самом деле, можно увидеть по функциям, вызванным существующими модулями (например, pcm2.o), что это потоковый драйвер. Следовательно, может существовать возможность получения доступа к драйверу данного класса напрямую (существует много примеров в DDK, информация предоставлена далее).

Оказывается, данный потоковый драйвер обернут другими функциональными вызовами (то есть, следующие функции вызываются pcm2.o):

_EAP_CC_Mute
_EAP_CC_RemoveStream
_EAP_CC_RequestStream
_EAP_CC_SetPanning
_EAP_CC_SetVolume
_EAP_CC_UnMute
_EAP_clock
_EAP_getTicks

Данные функции _EAP_* встроены в ядро DSP avs_kernel.out. Было бы полезно иметь заголовочный файл для данных функций и, если возможно, пример кода и/или инструкции, иллюстрирующие их использование.
Полезная информация по написанию драйверов для DSP устройств и использованию функций SIO_* предлагается здесь.

Еще один вариант – написать полностью новый минидрайвер, драйвер класса и реализацию оболочки. В начале это выглядит приемлемым заданием. Для его выполнения требуются DSP/BIOS Driver Developer Kit 1.20 с примерами и информацией по написанию драйверов, Библиотека поддержки чипа, с которым сопрягается DDK, и информация о самом аппаратном кодеке.

На устройстве 770 кодек называется aic23 (обратитесь к выходным данным dmesg). На устройстве N800 кодек называется TSC2301 (часть микросхемы сенсорного экрана) (снова обратитесь к выходным данным dmesg — обратитесь в данную ветку форума).

[ 312.232727] #0: OMAP24xx EAC with codec TSC2301

Данные в отношении указанных кодеков предлагаются на сайте Texas Instruments. Обратитесь на страницу для TSC2301. Здесь предлагается перечень технических характеристик с информацией, необходимой для написания минидрайвера.

К сожалению, нет полной уверенности, что возможно добавить новый минидрайвер без рекомпиляции ядра DSP (обратитесь в главу 3 документа spru616a.pdf в DDK – ссылка предлагалась ранее). Возможно, существует вероятность создания dsptask с драйвером, но полной уверенности нет.

За более подробной информацией о дизассемблировании обратитесь к документам:

spru374g Символика DSP кода Ассемблера
spru281f Соглашения о связях в c/c++ (Глава 6 Среда выполнения)
spru371f Информация о регистрах ЦП (Глава 2 Регистры ЦП и так далее)
spru280h.pdf Руководство пользователя по инструментам в Ассемблере TMS320C55x (глава 2 Введение в
Общий формат объектных файлов стр. 12 Дизассемблер

[править] Советы, приемы и устранение проблем

Проверьте, чтобы ссылка указывала на текущее ядро avs_kernel (сгенерированное из него пустое ядро). В противном случае оно не будет загружаться.

Проверьте, чтобы флаги для данного задания были правильно определены. Это особенно легко пропустить, так как названия флагов весьма похожи (и зашифрованы). Список предлагается в спецификации DSP gateway в PDF файле. Обратитесь к разделу TCFG.

Функция dbg(): позволяет выводить сообщения (подобно printf) в dmesg из DSP. В операционных системах до OS2008 требовалось перекомпилировать ядро, чтобы активировать сообщения об исправлении ошибок. В OS2008 они уже активированы. Используется следующим образом:

dbg('this is a message, this is a value=%d', some_value);

Обратите внимание, что переменная some_value должна иметь тип short или меньший (16 бит или меньше). Если передается 32 битное число, очень часто возвращается ноль (возможно, в силу странного порядка следования байтов 32 битного типа данных, что означает, что первые 16 битов относятся к старшим байтам). Поэтому разбейте 32 битные данные на 16 битные составляющие (или отбросьте их, если есть уверенность в ограниченности значений).

[править] Расположение данных

Были отмечены некоторые трудности при попытке получить доступ к массиву global const int. Проблема была в том, что каждый элемент массива возвращал ноль, а не его истинное значение. Исследование вопроса показало, что проблема связана с расположением глобальных констант в памяти. Изменение типа данных с глобальной целой константы (global const int) на просто глобальное целое (global int), разрешило проблему и был получен доступ к данным.

Далее данный вопрос не изучался, но в файле avs_kernelcfg.cmd можно увидеть расположения различных частей памяти, и может оказаться, что чтобы получить фактические данные (отличные от нуля), необходимо или использовать far функцию (обратитесь в руководство по DSP для C/C++) или убедиться, что данные находятся в правильном разделе памяти.

[править] Ссылки на документацию

[править] Оптимизация компилятора

TMS320C55x Руководство пользователя по оптимизации компилятора C/C++

  • стр. 79: 3.2 Выполнение оптимизации на уровне файла (опция -O3)
  • стр. 80: 3.3 Выполнение оптимизации на уровне программы (опции -pm и -O3)

[править] ASM с C/C++

TMS320C55x Руководство пользователя по оптимизации компилятора C/C++

  • стр. 83: 3.3.2 Анализ оптимизации при смешивании C и Ассемблера
  • стр. 176: 6.5 Сопряжение C/C++ с Ассемблером
  • стр. 178: Пример 6-3. Вызов функции языка Ассемблер из C
  • стр. 181: 6.5.3 Использование встроенного Ассемблера

TMS320C55x Руководство программиста по DSP

  • стр. 76: Таблица 3-6. Встроенные средства С компилятора TMS320C55x

[править] Разное

TMS320C55x Руководство пользователя по оптимизации компилятора C/C++

  • стр. 122: 5.3 Типы данных
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты