Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: imx233
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
sergey sva
Я не выбирал этот процессор, у меня была эта плата решил ее немного помочить в образовательных целях )
sergey sva
Возник такой вопрос скрипты одинаковые и для power_prep и для boot_prep
Код
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;
    . = ALIGN(4);
    .text : { *(.text) }
    .data : { *(.data) }
    .bss  : { *(.bss) }
}

Если к примеру добавлю файл с одной функцией и тоже проленкую с таким же скриптом, не пойму как запуститься на выполнение именно эта функция ?

Понял там есть файл на ассемблере, entry он передает управление.
sergey sva
В каком файле происходит инициализация usb, плохо ориентируюсь пока в исходниках ядра?
sergey sva
Что то у меня никак линукс не хочет работать, решил запустить готовое, скачал и сделал все как тут написано http://archlinuxarm.org/platforms/armv5/olinuxino но все равно не работает.
Там я так понимаю файловая система загрузчик и сам линукс ядро именно для платы olinuxino? sd чистая записал в нее ff
sergey sva
Все работает )). Помогите настроить интернет на этой плате,подключил ее пк с интернетом, думаю нужно настроить netctl может есть готовые скрипты ? на самом пк настроил iptable и порты 53 и прочее это все работает, пробовал к этому пк подключать другой пк интернет есть. Теперь подключил эту плату и нужно в ней настроить интернет.
sergey sva
интернет тоже заработал, в /etc/nectl есть примеры профилей настройки.
sergey sva
Еще проблема поставил lighttpd и fast_sgi, все сделал по этой инструкции вебсервер работает, а скрипты php открываются как обычной текст. в var/log/httpd пусто. Может такая проблема была у кого?
sergey sva
Еще вопрос по этому процессору и плате, Как долго проживет mmc у нее ведь есть ресурс на количество циклов записи, система по любому пишет логи?
Golikov A.
потому на компьютерах с твердотельными накопителями отключают и свапы и логи и все что можно отключить.


Но вообще эти карты живучие. Там и алгоритм равномерного износа, и алгоритм обхода испорченных секторов, и для места файловых таблиц увеличен ресурс. должна годы продержаться...
sergey sva
Понятно,попробую все лишнее отключить. php тоже заработал я не раскоментировал строчку где загружается модуль mod_fastcgi.
Еще вопрос как работать с gpio через modfs экспорт пинов сделал, появились /sys/class/gpio/gpioxx как к ним обращаться на с++?
Как работать через память нашел пример вроде понял.
sergey sva
Разобрался через open write.
sergey sva
Какой программкой лучше снять образ sdmmc в windows, Что бы полностью все, MBR снять ..?
Golikov A.
Когда делал поддержку SD кард, очень помогало WinHex, у него есть опция открыть диск, просто дает доступ к данным в посекторном режиме, и какие то асисты оказывает в разборе таблиц.
sergey sva
Сейчас скопировал Winhex с одной карты на другую все получилось. Только у меня не было карты на 2гб была на 4.
После копирования все работает ,но только на четырех гиговой карте видно только два утилитой df. Можно как то перемонтировать ее что бы остальное пространство прибавилось?
Golikov A.
конечно,
почитайте про файловые системы. В любой таблице есть разметка, на число секторов, размер кластеров и так далее... Копирую все данные, вы скопировали и эту разметку, потому и получилось 2.

Правда, там есть тонкость. Если у вас число кластеров в максимум, и надо менять их размер, то у вас все данные уедут. А если только число кластеров, то увеличите и дальше понеслось.
sergey sva
Не вручную же исправлять наверно утилитой какой нибудь?
Golikov A.
Цитата(sergey sva @ Feb 13 2014, 00:41) *
Не вручную же исправлять наверно утилитой какой нибудь?

ну строго говоря процедура посекторного переноса данных не совсем нормальная, потому ручками, ручкамиsm.gif... да там 1 число поправил и готово....

можно попробовать через управление дисками, в новых виндусах не размеченную часть можно присоединить
sergey sva
А как правильнее ?
Golikov A.
скорее как безопаснее, безопаснее через утилиту управления дисками, расширить диск на не размеченную область. Но это может не сработать, тогда ручками....
sergey sva
С этим теперь тоже все понятно, нужно отформатировать как нужно а потом все перекопировать.
Не понятно как в линукс работать с pwm adc dac нужно вначале драйвер делать или они уже есть в ядре?
sergey sva
Попробовал управлять пинами через sysfs export >> gpio32 потом вывожу 1 в gpio32 а у меня устанавливается gpio35 и все пины со смещение работают, может у кого было такое?
Golikov A.
похоже на смещение шины адреса при 32 (4 байтном) режиме обращения.
sergey sva
Как это можно победить ? )
Golikov A.
ну для начала надо убедиться что это так.
ну потом попробовать указатели разной битности...
sergey sva
Линукс мне этим и нравится ,что надо сделать то незнаю что, а потом убиться что сделал именно то не знаю что и после должно все заработать sm.gif
sergey sva
Никак не пойму почему так выходит.
Нажмите для просмотра прикрепленного файла
sergey sva
Попробовал через память тоже все смещено так же.
Код
    gpio_map();
    gpio_output(0,4);
    
    while(1)
    {
    GPIO_WRITE_PIN(4,1);
    sleep(1);
    GPIO_WRITE_PIN(4,0);
    sleep(1);
    
    }

Вместо PIN4 вывод на PIN13/LCD_D12. Не знаю что уже смотреть.

или
Код
    gpio_map();
    gpio_output(1,32);
    
    while(1)
    {
    GPIO_WRITE_PIN(32,1);
    sleep(1);
    GPIO_WRITE_PIN(32,0);
    sleep(1);
    
    }

Этот код выводит на PIN1/LCD_D00.
Неправильный доступ и через прямой доступ и через sysfs. У меня уже нет ума где смотреть
Разъем Нажмите для просмотра прикрепленного файла
sergey sva
Разобрался после долгих экспирементов, gpio нумеруются 0 gpio -> это банк 0 пин 0; 32 gpio -> это банк 1 пин 0 и тд.
Если ядро поддерживает gpio ио к ним можно и лучше обращаться через sysfs. Набросал немного кода, работает может кому сгодится.
h
Код
#define     SIZENAM                  255

enum pinstatus {PIN_OFF,PIN_ON};
enum pindirection{PIN_IN,PIN_OUT};

int gpioexp(int pin_num,pindirection pd,pinstatus st);
int gpioini();
int gpioset(int pin_num,pinstatus ps);
pinstatus gpioget(int pin_num);

cpp
CODE
#include <stdio.h> /* For printf() */
#include <string.h> /* For strerror() */
#include <unistd.h> /* For read(), close() */
#include <fcntl.h> /* For open() */
#include <errno.h> /* For errno */
#include <sys/poll.h> /* For poll() */
#include <time.h>
#include <stdlib.h>
#include "gpio.h"


/*-------------------------------------------------------------------------------------------------------*/
int gpioexp(int pin_num,pindirection pd,pinstatus st){
FILE * fp = NULL;
char gpio_file_name[SIZENAM];
if ((fp = fopen("/sys/class/gpio/export", "ab")) != NULL)
{
rewind(fp);
fprintf(fp,"%d",pin_num);
fclose(fp);

}else{
printf("Cannot open GPIO value for %s\n","/sys/class/gpio/export");
return -1;
}

memset(gpio_file_name,0,SIZENAM);
sprintf(gpio_file_name,"/sys/class/gpio/gpio%d/direction",pin_num);
if ((fp = fopen(gpio_file_name, "rb+")) != NULL)
{
rewind(fp);
switch(pd){
case PIN_IN:{
fprintf(fp,"in");
break;
}//case
case PIN_OUT:{
fprintf(fp,"out");
break;
}//case
default:break;
}//switch
fclose(fp);
if(pd!= PIN_IN){

memset(gpio_file_name,0,SIZENAM);
sprintf(gpio_file_name,"/sys/class/gpio/gpio%d/value",pin_num);
if ((fp = fopen(gpio_file_name, "rb+")) != NULL)
{
switch(st){
case PIN_ON:{
fprintf(fp,"1");
break;
}//case
case PIN_OFF:{
fprintf(fp,"0");
break;
}//case
default:break;
}//switch
fclose(fp);
}
}

}
return 0;
}
/*-------------------------------------------------------------------------------------------------------*/
int gpioini(){
/* pin out */
gpioexp(32,PIN_OUT,PIN_OFF);
gpioexp(39,PIN_OUT,PIN_OFF);

/* pin in */
gpioexp(23,PIN_IN,PIN_OFF);

return 0;
}
/*-------------------------------------------------------------------------------------------------------*/
int gpioset(int pin_num,pinstatus ps){
FILE * fp = NULL;
char gpio_file_name[SIZENAM];

memset(gpio_file_name,0,SIZENAM);
sprintf(gpio_file_name,"/sys/class/gpio/gpio%d/value",pin_num);
if ((fp = fopen(gpio_file_name, "rb+")) != NULL)
{
switch(ps){
case PIN_ON:{
fprintf(fp,"1");
break;
}//case
case PIN_OFF:{
fprintf(fp,"0");
break;
}//case
default:break;
}//switch

fclose(fp);
}
return 0;
}
/*-------------------------------------------------------------------------------------------------------*/
pinstatus gpioget(int pin_num){
FILE * fp = NULL;
char gpio_file_name[SIZENAM];
long lSize;
char * buffer;
size_t result;
int temm =0;
pinstatus ret = PIN_OFF;

memset(gpio_file_name,0,SIZENAM);
sprintf(gpio_file_name,"/sys/class/gpio/gpio%d/value",pin_num);
if ((fp = fopen(gpio_file_name, "rb+")) != NULL)
{
fseek (fp , 0 , SEEK_END);
lSize = ftell (fp);
rewind (fp);

buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {
printf("Memory error");
}else{

result = fread (buffer,1,lSize,fp);
temm = atoi(buffer);

switch(temm){
case 0:{
ret = PIN_OFF;;
break;
}//case
case 1:{
ret = PIN_ON;
break;
}//case
default:break;
}//switch


}
free (buffer);
fclose(fp);
}
return ret;
}
/*-------------------------------------------------------------------------------------------------------*/

Есть еще одна проблема, после перезагрузки часы слетают, даже если есть батарея. Может у кого была похожая проблема?
sergey sva
Из чего могут часы сбрасываться после перезагрузки ? на аккумуляторе напряжение 3,6.
sergey sva
В этом микроконтроллере нет часов есть Real-time clock который считает милисекунды, от него скорее всего считает время ос. Поэтому после перезагрузки нужно синхронизировать время каждый раз.
sergey sva
Еще заметил такое, если отверткой коснуться корпуса(общего провода) ,мост usb ethernet теряется, не всегда но бывает.
sergey sva
Что можно придумать что бы часы не сбрасывались каждый раз после перезагрузки?
Golikov A.
поставить внешние часы с батарейкой и с них брать данные после загрузки.
ну или не выключатся, а засыпать, и каждые час просыпаться корректировать часы. 32 битный счетчик таймера в микросекундах может насчитать 71 минуту
sergey sva
Сделал как вы посоветовали вроде все работает. У меня еще один вопрос у imx233 есть два аналоговых входа LRADC0 - 1 Мне нужно измерять 4 аналоговых сигнала (4 потенциометра), думал поставить мультиплесор типа4051 и переключать каналы на какой ни будь вход LRAD. Но проверил если я его замыкаю на землю то значение ацп 5-7 если на 3,3в то 3500. В документации написано что эти каналы низкого разрешениея12 бит
Какая точность будет, какой точности источник опорного напряжения, может все будет плавать в документации написано много но ничего не понятно. Как подсчитать какую точность даст этот ацп, или лучше поставить внешний ацп?
Golikov A.
12 битное АЦП дает 4096 значений, на весь свой диапазон работы обычно от 0 до 2 Vref, ну или -VRef до +Vref.
дальше выбираете сигнал какой хотите мерить подбираете рефернс и получаете разрешение.


С тем что у вас сейчас мы получаем на 3.3 вольта диапазон кодов 3500-7 = 3493.
и того у вас разрешение АЦП порядка 1 мВольт на код.
Усредняя значения и ставя хорошие буферы на входе можно получить точность в одной температуре +- 1 - 2 кода, то есть +- 2 мВольта.
общая дельта 4 мВольта от вашего сигнала 3.3 вольта - это примерно 0.1% приведенной погрешности

Дальше надо понять уход в температуре, и прочее, это надо читать в даташите на АЦП и опорник, какую погрешность оно дает на градус, умножаете на температурный диапазон и плюсуете, думаю для медленно меняющихся сигналов в ваших условиях вы получите где то 0.5% на приведенной погрешности.

Это что касается ацп, дальше у вас будет мультиплексор, который наверное тоже что-то внесет, или нет, я в них не особо понимаюsm.gif...

Вот и оценивайте хватает вам этого или нет
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.