Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
Плата как flash drive и вообще проект
sasamy
Добавлено 16.03.2013 11:21 Редактировалось 16.03.2013 11:28 Сообщение: 21
sasamy
4.70

Пункты: 77067
Регистрация: 14.08.2009
Цитата

В Webradio при отсутствии связи оно подсовывает в mp3-поток озвучку своих действий, например, "Connecting", "Buffering", "Error" и т.п.
..
Я на андроиде установил AutomateIt и настроил следующие задачи (банально):


Все это элементарно делается в linux - тут столько готовых плюшек для юзерспейс что вебрадио и андроид нервно курят в cторонке, главное в юзерспейс выставить стандартный интерфейс - написать драйвер, дальше вы уже сами решайте что там навесить сверху, хоть
http://www.icecast.org
Со стороны магнитолы которая будет воспроиводить мы можем получить только два события - что она читает (узнать какая радистанция - имя файла по таблице FAT) и читает ли вообще.
Спуститься к концу Подняться к началу
Персональная информация
plr
Добавлено 16.03.2013 13:40 Сообщение: 22
plr
0

Пункты: 898
Регистрация: 06.10.2012
Webradio интегрируется с сервисом Tunein, в котором настраивается профиль с нужными потоками и Webradio представляет их отдельными mp3-файлами, если смотреть на содержимое флешки.

Нужно:

1. Драйвер файловой системы с возможностями:
- формирования структуры файлов исходя из неких настроек;
- отображением "файлов";
- подстановкой аудиопотока при его считывании "файлов";
- подстановка предзаписанных mp3-потоков с сообщениями.

2. Событийный скрипт для автоматизации процессов включения/выключения и т.д.

3. Интеграция с интернет-профилем для настройки радиостанций.

4. Управление 3G-модемами

Можно ли вышеописанный софт сделать "кросплатформенный", чтобы мог запускаться на Raspberry Pi (Raspbian) и других SoC (понятно с ограничениями, т.е. не на всех)? Такая задача должна стоять перед проектом?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 22.03.2013 13:46 Редактировалось 22.03.2013 16:30 Сообщение: 23
sasamy
4.70

Пункты: 77067
Регистрация: 14.08.2009
Вот работающий прототип драйвера, есть еще вопроосы но вроде все решаемо. Драйвер прикидывается диском в принципе любого размера, я пробовал с размером 8G. На at91sam9g45, пока без модема - через изернет но это не принципиально - модемы на плате точно работают.
На плате
# tftp -g -r rdisk.ko 192.168.0.2
# insmod rdisk.ko
# mkdosfs /dev/rdisk0
# mount /dev/rdisk0 /mnt
# dd if=/dev/zero of=/mnt/europaplus.mp3 bs=1M count=1024
# umount /mnt
# modprobe g_mass_storage file=/dev/rdisk0
# mkfifo fifo
# dd if=fifo of=/dev/rdisk0 bs=512 seek=32760 &
# wget http://radio.sampo.ru/europaplus.mp3 -O fifo &

Лог на хост системе

Цитата

[18789.066761] usb 1-1.1.3: new high speed USB device using ehci_hcd and address 14
[18789.180400] usb 1-1.1.3: configuration #1 chosen from 1 choice
[18789.187192] scsi20 : SCSI emulation for USB Mass Storage devices
[18789.187478] usb-storage: device found at 14
[18789.187482] usb-storage: waiting for device to settle before scanning
[18794.190094] usb-storage: device scan complete
[18794.190655] scsi 20:0:0:0: Direct-Access Linux File-CD Gadget 0318 PQ: 0 ANSI: 2
[18794.191806] sd 20:0:0:0: Attached scsi generic sg5 type 0
[18794.195061] sd 20:0:0:0: [sdd] 16777216 512-byte logical blocks: (8.58 GB/8.00 GiB)
[18794.305361] sd 20:0:0:0: [sdd] Write Protect is off
[18794.305369] sd 20:0:0:0: [sdd] Mode Sense: 0f 00 00 00
[18794.305374] sd 20:0:0:0: [sdd] Assuming drive cache: write through
[18794.308317] sd 20:0:0:0: [sdd] Assuming drive cache: write through
[18794.308325] sdd:
[18794.415282] sd 20:0:0:0: [sdd] Assuming drive cache: write through
[18794.415293] sd 20:0:0:0: [sdd] Attached SCSI removable disk


Вот как он видится

Цитата

sasa@sasa-laptop:~/atmel/player/rdisk$ mount
...
/dev/sdd on /media/6645-4346 type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,flush)
sasa@sasa-laptop:~/atmel/player/rdisk$ ls -l /media/6645-4346
total 1048576
-rwxr-xr-x 1 sasa sasa 1073741824 2007-01-01 00:42 europaplus.mp3


файл играет на любом плеере в системе

Цитата

sasa@sasa-laptop:~/atmel/player/rdisk$ mplayer /media/6645-4346/europaplus.mp3
MPlayer SVN-r1.0~rc3+svn20090426-4.4.3 (C) 2000-2009 MPlayer Team
mplayer: could not connect to socket
mplayer: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing /media/6645-4346/europaplus.mp3.
Audio only file format detected.
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
mpg123: Can't rewind stream by 864 bits!
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
mpg123: Can't rewind stream by 190 bits!
A: 21.2 (21.2) of 67108.0 (18:38:28.0) 0.6%

MPlayer interrupted by signal 2 in module: play_audio
A: 21.4 (21.4) of 67108.0 (18:38:28.0) 0.6%


Цитата

/*
* (C) www.starterkit.ru
* Redistributable under the terms of the GNU GPL.
*/

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>

#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/vmalloc.h>
#include <linux/genhd.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h>
#include <linux/list.h>

#define SECTOR_SIZE 512
#define RAM_SECTORS (32752 + 8)
#define DISK_SECTORS (8 * 1024 * 1024 * 2)
#define RSECTORS 2048

static int rdisk_major = 0;
static struct request_queue *Queue;

struct rdisk_sector {
struct list_head list;
sector_t sector;
char data[SECTOR_SIZE];
};

static struct rdisk_dev {
struct list_head head;
struct list_head pool;
struct rdisk_sector *rsectors;
spinlock_t lock;
char *ram;
struct gendisk *gd;
} Device;

void rdisk_write_sector(struct rdisk_dev *dev, sector_t sector, char *buff)
{
struct rdisk_sector *entry;

if (!list_empty(&dev->pool))
entry = list_entry(dev->pool.next, struct rdisk_sector, list);
else
entry = list_entry(dev->head.next, struct rdisk_sector, list);

entry->sector = sector;
memcpy(entry->data, buff, SECTOR_SIZE);
list_move_tail(&entry->list, &dev->head);
}

void rdisk_read_sector(struct rdisk_dev *dev, sector_t sector, char *buff)
{
struct rdisk_sector *entry;

list_for_each_entry(entry, &dev->head, list) {
if (entry->sector == sector) {
memcpy(buff, entry->data, SECTOR_SIZE);
list_move(&entry->list, &dev->pool);
return;
}
}
}

static int rdisk_transfer(struct rdisk_dev *dev, sector_t sector,
unsigned long nsect, char *buffer, int write)
{
if (sector >= RAM_SECTORS) {
unsigned long s;

if (write)
for (s = 0; s < nsect; s++)
rdisk_write_sector(dev, sector + s, buffer + SECTOR_SIZE * s);
else
for (s = 0; s < nsect; s++)
rdisk_read_sector(dev, sector + s, buffer + SECTOR_SIZE * s);
} else {
unsigned long offset = sector * SECTOR_SIZE;
unsigned long nbytes = nsect * SECTOR_SIZE;

if (write)
memcpy(dev->ram + offset, buffer, nbytes);
else
memcpy(buffer, dev->ram + offset, nbytes);
}
return 0;
}

static void rdisk_request(struct request_queue *q)
{
struct request *req;

req = blk_fetch_request(q);
while (req != NULL) {
if (req == NULL || (req->cmd_type != REQ_TYPE_FS)) {
printk (KERN_NOTICE "Skip non-CMD request\n");
__blk_end_request_all(req, -EIO);
continue;
}
if (rdisk_transfer(&Device, blk_rq_pos(req), blk_rq_cur_sectors(req),
req->buffer, rq_data_dir(req)))
__blk_end_request_cur(req, -EIO);

if ( ! __blk_end_request_cur(req, 0)) {
req = blk_fetch_request(q);
}
}
}

static struct block_device_operations rdisk_ops = {
.owner = THIS_MODULE,
};

static int __init rdisk_init(void)
{
int i;

Device.ram = vmalloc(RAM_SECTORS * SECTOR_SIZE);
if (Device.ram == NULL)
goto out;

Device.rsectors = vmalloc(RSECTORS * sizeof (struct rdisk_sector));
if (Device.rsectors == NULL)
goto out_vfree_ram;

INIT_LIST_HEAD(&Device.head);
INIT_LIST_HEAD(&Device.pool);

for (i = 0; i < RSECTORS; i++)
list_add(&Device.rsectors[i].list, &Device.pool);

spin_lock_init(&Device.lock);

Queue = blk_init_queue(rdisk_request, &Device.lock);
if (Queue == NULL)
goto out_vfree_all;
blk_queue_logical_block_size(Queue, SECTOR_SIZE);

rdisk_major = register_blkdev(rdisk_major, "rdisk");
if (rdisk_major < 0) {
printk(KERN_WARNING "rdisk: unable to get major number\n");
goto out_vfree_all;
}

Device.gd = alloc_disk(1);
if (!Device.gd)
goto out_unregister;
Device.gd->major = rdisk_major;
Device.gd->first_minor = 0;
Device.gd->fops = &rdisk_ops;
Device.gd->private_data = &Device;
strcpy(Device.gd->disk_name, "rdisk0");
set_capacity(Device.gd, DISK_SECTORS);
Device.gd->queue = Queue;
add_disk(Device.gd);
return 0;

out_unregister:
unregister_blkdev(rdisk_major, "rdisk");
out_vfree_all:
vfree(Device.rsectors);
out_vfree_ram:
vfree(Device.ram);
out:
return -ENOMEM;
}

static void __exit rdisk_exit(void)
{
del_gendisk(Device.gd);
put_disk(Device.gd);
unregister_blkdev(rdisk_major, "rdisk");
blk_cleanup_queue(Queue);
vfree(Device.rsectors);
vfree(Device.ram);
}

module_init(rdisk_init);
module_exit(rdisk_exit);
MODULE_LICENSE("GPL");
Спуститься к концу Подняться к началу
Персональная информация
plr
Добавлено 22.03.2013 14:09 Сообщение: 24
plr
0

Пункты: 898
Регистрация: 06.10.2012
sasamy, фантастика! Сейчас попробую протестировать, а как подключить плату в usb device mode?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 22.03.2013 16:01 Редактировалось 22.03.2013 16:24 Сообщение: 25
sasamy
4.70

Пункты: 77067
Регистрация: 14.08.2009
Я пробую на OEM, на материнской плате есть квадратный разъем, кабель от принтера, перемычка (J2) с питания снята. Модуль стандартный, ядро стандартное, утилиты тоже - будет работать на любой плате с Linux.

Слушаю свою di.fm :)
# wget http://stream-79.shoutcast.com:80/progressive_mp3_96kbps -O fifo &

Если квадратной дырки нет а есть только 2 обычных прямоугольных разъема - купите переходник USB AM-AM, в любом ларьке наверно есть, стоит 30-40 руб, включается через шнурок-удлинитель
http://images.yandex.ru/yandsearch?text=%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0%20usb%20am-am&img_url=http%3A%2F%2Fstatic3.tme.eu%2Fkatalog_pics%2Fa%2F4%2Fe%2Fa4eae8cfdcc5b410591106bb474c58f8%2Fusb-am_am_t.jpg&pos=0&rpt=simage&lr=213&noreask=1&source=wiz

или кабель сразу такой купите. Только не перепутайте на плате HOST и DEVICE порты - смотрите схему.
Спуститься к концу Подняться к началу
Персональная информация
plr
Добавлено 24.03.2013 17:56 Сообщение: 26
plr
0

Пункты: 898
Регистрация: 06.10.2012
sasamy, разъясните пожалуйста как (с помощью каких действий) можно перевести USB на плате в device mode?

Какая характеристика платы говорит о том, что USB можно перевести в device mode? Например, можно на обычном PC перевести USB в device mode? Если нет, то, что этому мешает? Мне удалось понять (вычитать), что не удастся перевести те порты, которые подключены от хаба.
Спуститься к концу Подняться к началу
Персональная информация
lexx666
Добавлено 19.04.2013 12:30 Сообщение: 27
lexx666
3.83

Пункты: 11780
Регистрация: 28.07.2011
Пол: Мужчина
Из: Барнаул
USB OTG можно перевести в режим HOST либо DEVICE.
Википедия разъяснит :)

USB HOST, которые на компьютере используются соотвественно в режим DEVICE не переведешь.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux