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

Kekek

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о Kekek

  • Звание
    Участник
    Участник
  • День рождения 06.03.1974

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array
  1. Прописать в переменной окружения PATH путь к библиотекам. От модератора. Удалил ненужное цитирование. В топике, состоящем всего из одного вопроса и одного ответа, цитирования не требуется. И так понятно, где вопрос, а где ответ на него.
  2. 50g - это очень слабый удар молоточка по железу, легончко - тюк. Чуть сильнее удар - зашкаливает датчик на 400g.
  3. Были проблемы с прикручиванием графики к конкретному TFT. В примерах одна глубина цвета, а контроллер поддерживает другую. Параллельные потоки использовал, работает нормально. Только нагрузка на систему процентов десять двадцать. Под большей нагрузкой не гонял.
  4. Первый вариант низкоуровневый доступ: uClinux-dist/user/blkfin-test/video_test/lissa.c. Проверял, рисует. Второй вариант - через Nano-x: uClinux-dist/user/microwin/src/demos/nanox/tux.c. Тоже проверял, работает. Дальше эксперементов дело не пошло, потому что немного поменялось направление разработки.
  5. Я делал через ssh из пакета cygwin. Работало, по-моему, и через ввод паролей.
  6. Это тоже мой первый драйвер, есть недостатки, но он работает. За основу взял драйвер из более старой версии uClinux, немного переделал его под свои нужды. В новых версиях uClinux уже совсем другой драйвер, который имеет мало общего со старым. #include <linux/kernel.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/wait.h> #include <linux/poll.h> #include <linux/errno.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/dma-mapping.h> #include <asm/io.h> #include <asm/irq.h> #include <asm/blackfin.h> #include <asm/dma.h> #include <asm/bfin5xx_spi.h> #include <linux/spi/spi.h> /* definitions */ #define SPI_BUF_LEN 1404 #define SPI_REGSIZE 16 #define SPI_MAJOR 252 /* experiential */ #define SPI0_MINOR 0 #define SPI_DEVNAME "spi" #define SPI_INT0NAME "spiint0" /* Should be less than 19 chars. */ #define BFIN_SPI_DEBUG 1 #ifdef BFIN_SPI_DEBUG #define PRINTK(args...) printk(args) #else #define PRINTK(args...) #endif typedef struct Spi_Device_t { int opened; int nonblock; int master; int bdrate; int channel; /* only valid in master mode */ int polar; int phase; int outenable; int irqnum; int byteorder; /* 0: MSB first; 1: LSB first; */ int recvopt; /* 0: Discard packet if Rxbuffer is full; 1: Flush Rxbuffer if it is full; */ uint8_t *bufptr; uint8_t *rxbuf; uint64_t count; uint64_t count_read; dma_addr_t addr; wait_queue_head_t* rx_wq; }spi_device_t; /* Globals */ /* We must declare queue structure by the following macro. * firstly declare 'wait_queue_head_t' and then 'init_waitqueue_head' * doesn't work in 2.4.7 kernel / redhat 7.2 */ static DECLARE_WAIT_QUEUE_HEAD(spirxq0); static spi_device_t spiinfo; #define DEFINE_SPI_REG(reg, off) \ static inline u16 read_##reg(void) \ { return *(volatile unsigned short*)(SPI0_REGBASE + off); } \ static inline void write_##reg(u16 v) \ {*(volatile unsigned short*)(SPI0_REGBASE + off) = v;\ __builtin_bfin_ssync();} DEFINE_SPI_REG(CTRL, 0x00) DEFINE_SPI_REG(FLAG, 0x04) DEFINE_SPI_REG(STAT, 0x08) DEFINE_SPI_REG(TDBR, 0x0C) DEFINE_SPI_REG(RDBR, 0x10) DEFINE_SPI_REG(BAUD, 0x14) DEFINE_SPI_REG(SHAW, 0x18) #define START_STATE ((void*)0) #define RUNNING_STATE ((void*)1) #define DONE_STATE ((void*)2) #define ERROR_STATE ((void*)-1) static irqreturn_t spi_adc_dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs) { clear_dma_irqstat(CH_SPI); spiinfo.count++; spiinfo.recvopt = 1; wake_up_interruptible(&spirxq0); return IRQ_HANDLED; } static ssize_t spi_adc_read(struct file *filp, char *buf, size_t count, loff_t *pos) { int ierr; /* Wait for data available */ if (spiinfo.count - spiinfo.count_read <= 1) { ierr = wait_event_interruptible(spirxq0, spiinfo.recvopt); if (ierr) /* waiting is broken by a signal */ return ierr; } else if (spiinfo.count - spiinfo.count_read > 30) { printk("spi_adc_read: %d\n", (uint32_t) (spiinfo.count - spiinfo.count_read)); return -EINVAL; } spiinfo.recvopt = 0; spiinfo.bufptr = spiinfo.rxbuf + SPI_BUF_LEN * ( spiinfo.count_read & 0x1F ); memmove(buf, spiinfo.bufptr, SPI_BUF_LEN); spiinfo.count_read++; return SPI_BUF_LEN; } static int spi_adc_ioctl(struct inode *inode, struct file *filp, uint cmd, unsigned long arg) { switch (cmd) { case CMD_SPI_SET_BAUDRATE: write_BAUD((uint16_t) arg); break; default: return -EINVAL; } return 0; } static int spi_adc_open(struct inode *inode, struct file *filp) { char intname[20]; int minor = MINOR (inode->i_rdev); /* SPI 0 ? */ if(minor != SPI0_MINOR) return -ENXIO; if(spiinfo.opened) return -EMFILE; /* Clear configuration information */ memset(&spiinfo, 0, sizeof(spi_device_t)); if(filp->f_flags & O_NONBLOCK) spiinfo.nonblock = 1; spiinfo.rx_wq = &spirxq0; spiinfo.opened = 1; spiinfo.phase = 1; spiinfo.recvopt = 0; spiinfo.bdrate = SPI_DEFAULT_BARD; spiinfo.count = 0; spiinfo.count_read = 0; strcpy(intname, SPI_INT0NAME); spiinfo.irqnum = SPI0_IRQ_NUM; write_STAT(BIT_STAT_CLR); disable_dma(CH_SPI); clear_dma_irqstat(CH_SPI); spiinfo.rxbuf = dma_alloc_coherent(NULL, SPI_BUF_LEN << 5, &spiinfo.addr, GFP_DMA); spiinfo.bufptr = NULL; bfin_write_PORTF_FER(bfin_read_PORTF_FER() | 0x7c00); __builtin_bfin_ssync(); bfin_write_PORTF_FER(bfin_read_PORTF_FER() & 0xFFBF); __builtin_bfin_ssync(); bfin_write_PORTFIO_DIR(bfin_read_PORTFIO_DIR() | 0x0040); __builtin_bfin_ssync(); /*bfin_write_PORTG_FER(bfin_read_PORTG_FER() & 0xFFCF); __builtin_bfin_ssync(); bfin_write_PORTGIO_DIR(bfin_read_PORTGIO_DIR() | 0x0030); __builtin_bfin_ssync(); bfin_write_PORTGIO_SET(bfin_read_PORTGIO() | 0x0030); __builtin_bfin_ssync();*/ write_BAUD(256); write_FLAG(0xFD02); write_CTRL(0x0000); set_dma_start_addr(CH_SPI, (unsigned long) spiinfo.rxbuf); set_dma_x_count(CH_SPI, SPI_BUF_LEN); set_dma_x_modify(CH_SPI, 1); set_dma_y_count(CH_SPI, 32); set_dma_y_modify(CH_SPI, 1); dma_enable_irq(CH_SPI); set_dma_config(CH_SPI, WNR | WDSIZE_8 | DI_EN | DMAFLOW_AUTO | DI_SEL | DMA2D); enable_dma(CH_SPI); write_CTRL(CFG_SPI_DMAREAD | (CFG_SPI_ENABLE << 14)); bfin_write_PORTFIO_SET(bfin_read_PORTFIO() | 0x0040); __builtin_bfin_ssync(); return 0; } static int spi_adc_release (struct inode *inode, struct file *filp) { write_CTRL(0x0000); bfin_write_PORTFIO_CLEAR(bfin_read_PORTFIO() | 0x0040); __builtin_bfin_ssync(); /*bfin_write_PORTGIO_CLEAR(bfin_read_PORTGIO() | 0x0030); __builtin_bfin_ssync();*/ write_STAT(BIT_STAT_CLR); disable_dma(CH_SPI); dma_disable_irq(CH_SPI); clear_dma_irqstat(CH_SPI); dma_free_coherent(NULL, SPI_BUF_LEN << 5, spiinfo.rxbuf, spiinfo.addr); spiinfo.opened = 0; return 0; } static struct file_operations spi_fops = { owner: THIS_MODULE, read: spi_adc_read, ioctl: spi_adc_ioctl, open: spi_adc_open, release: spi_adc_release, }; #ifdef MODULE int init_module(void) #else int __init spi_init(void) #endif /* MODULE */ { int result; printk("spi0: INIT\n"); result = register_chrdev(SPI_MAJOR, "spi", &spi_fops); if (result < 0) { printk(KERN_WARNING "spi0: can't get minor %d\n", SPI_MAJOR); return result; } if(request_dma(CH_SPI, "BF53x_SPI_DMA") < 0) { PRINTK("Unable to request BlackFin SPI DMA channel\n"); return -ENODEV; } set_dma_callback(CH_SPI, (void*)spi_adc_dma_irq_handler, &spiinfo); dma_disable_irq(CH_SPI); return 0; } #ifdef MODULE void cleanup_module(void) #else void spi_uninit(void) #endif /* MODULE */ { unregister_chrdev(SPI_MAJOR, SPI_DEVNAME); printk("<1>Goodbye spi \n"); } module_init(spi_init); module_exit(spi_uninit);
  7. Пытался приспособить встроенный драйвер для непрерывного чтения с АЦП. Плюнул и написал свой через ДМА.
  8. Можно попробовать собрать ADA из gcc. Говорят, очень похож на Pascal.
  9. Нет, есть только приборы, которые позволяют измерять и анализировать вибрацию.
  10. Тоже заказываем у PCB радиозавода, претензий нет.
  11. Если под uClinux, то компилировать, примерно, так: test: test.c $(CC) $(CFLAGS) test.c -o test -Wl,-elf2flt Если под elf, то не знаю, не пользовался таким.
  12. Посмотри содержимое rpm-пакетов с помощью rpm -qpl blackfin-toolchain-elf-gcc-4.1-07r1.1-3.i386.rpm
  13. Скорей всего, в первом пакете присутствует две версии gcc: 4.1 и 3.4
  14. Да, тоже есть проблемы с комплектацией. Некоторые позиции можно заказать только в Москве. Хорошо, что у нас через кого покупать в Москве.
  15. Есть ещё компилятор от Intel. Только нужно лицензию внимательно читать, по-моему, он бесплатен только для некоммерческого применения. http://www.intel.com/software/products/compilers/clin
×
×
  • Создать...