LINUX.ORG.RU

Избранные сообщения ATIpro

Посоветуйте толковые книги на русском/английском по Си++ (Cxx11)

Форум — Development

Посоветуйте толковые книги на русском/английском по Си++.
Чтобы был нормальный перевод и содержание.
У меня где-то лежит каталог с O'Reilly, надо бы посмотреть среди них. Ещё что-то брал по акции «книга за 1 рубль» в books.ru

В двух словах - я старпёр, который изучал Си/Си++ в 1996-1997 году по книжкам:
* В.В.Подбельский Язык Си++ (Финансы и статистика)
* Беляков М.И., Рабовер Ю.И., Фридман А.Л. Мобильная операционная система
* немного смотрел русский перевод Керниган-Ритчи в бумажном виде в библиотеке когда интернетов не было, а свою книгу купить - стипендия не позволяла
* в 2004-2005 году читал книгу Страуструп Б. Дизайн и эволюция С++

Все эти книги читал в бумажном варианте.

По работе писал только на Си с классами и на Паскале с классами (+Делфи). Сейчас хотел бы по-изучать Си++, чтобы понимать современный код. Какие книги посоветуете? Интересует компактное изложение фундаментальных основ, желательно - на русском языке. Или что-то не очень тяжёлое на английском (чтобы не надо было переводить каждое слово со словариком). Надеюсь, понятно объяснил. Спасибо.

Просто я встретил на днях код вида

A::B::C::D ...
, и понял, что пора догонять поезд. На университетских знаниях 20-летней давности сейчас делать почти нечего. Хочу перестать заниматься быдлокодерством, и начать осваивать современные знания.

Ещё - есть ли краткая табличка с основными различиями в стандартах (Comparison table/list)? Или лучше просто прочитать для начала Wikipidia:C++11, и составлять такую таблицу самому?

За что браться не следует однозначно новичку, что освоить для быстрого JFF-эффекта, если хорошо знал в своё время Си с классами? Нравится концепция namespaces. Ещё хотелось бы впоследствии плавный переход на какую-то функциональщину, чтобы знания по современному Си++ пригодились. Какие концепции/подходы есть общие?

 ,

Mirage1_
()

Тестирование «C» кода.

Форум — Development

Всем привет ::) Господа, вы наверное будете в голос ржать, но я в жизни не занимался тестированием кода, вот прям сосем никогда, от того прошу советов как тестировать чем тестировать и что по теме почитать/поучить как это дело автоматизируется и прочее. Да есть google, но я как всегда иду туда в последнюю очередь. Ну и смею себе позволить позвать людей (кого с ходу вспомню) плотно работающий с «С». Cast DELIRIUM, i-rinat, beastie, ncrmnt, theNamelessOne, Murg, Iron_Bug. Всем добра и улыбашек ::)

По просьбе i-rinat пример кода (просто рандомный код из закромов откопанный/заброшенный/недописанный, в общем то что нужно)

#include <stddef.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

struct $struct_neuron
{
    size_t  id;
    struct  $struct_neuron ** sinapses_connections;
    size_t  sinapses_connections_size;
    float * sinapses_weight;
    struct  $struct_neuron ** acsons_connections;
    size_t  acsons_connections_size;
    float   acsons_result_signals;
    void   (*finp)();
    void   (*fmid)();
    void   (*fout)();
};typedef struct $struct_neuron struct_neuron;

struct $struct_network
{
    size_t id;
    size_t network_size;
    struct_neuron * neurons;
    struct $struct_network ** network_connections;
    size_t network_connections_size;;
};typedef struct $struct_network struct_network;


struct $struct_net_union
{
    size_t id;
    struct_network ** networks;
    size_t net_union_size;

};typedef struct $struct_net_union struct_net_union;


struct_neuron neuro_neuron_new(void);
void neuro_neuron_connect(struct_neuron* acson, struct_neuron * sinaps);

struct_network neuro_network_new(size_t neurons);
void neuro_network_connect(struct_network* net1, struct_network* net2);



#include "neuro.h"




struct_neuron neuro_neuron_new(void)
{
    static size_t id=0;
    struct_neuron neuron;
    neuron.id=id++;
    neuron.sinapses_connections      = NULL;
    neuron.sinapses_connections_size = 0;
    neuron.sinapses_weight           = NULL;
    neuron.acsons_connections        = NULL;
    neuron.acsons_connections_size   = 0;
    neuron.acsons_result_signals     = 0.0;
    return neuron;
}

void neuro_neuron_connect(struct_neuron * acson, struct_neuron * sinaps)
{
    sinaps->sinapses_weight = realloc(sinaps->sinapses_weight,sizeof(float)*sinaps->sinapses_connections_size+1);
    srand(clock());
    sinaps->sinapses_weight[sinaps->sinapses_connections_size] = (float)(rand()/100000009);
    sinaps->sinapses_connections = realloc(sinaps->sinapses_connections,sizeof(struct_neuron)*(sinaps->sinapses_connections_size+1));
    sinaps->sinapses_connections[sinaps->sinapses_connections_size++] = acson;
    acson->acsons_connections = realloc(acson->acsons_connections,sizeof(struct_neuron)*(acson->acsons_connections_size+1));
    acson->acsons_connections[acson->acsons_connections_size++] = sinaps;
}



struct_network neuro_network_new(size_t neurons)
{
    static size_t id = 0;
    struct_network network;
    network.id = id++;
    network.network_size = neurons;
    network.neurons = NULL;
    network.network_connections = NULL;
    network.network_connections_size = 0;
    network.neurons = malloc(sizeof(struct_neuron)*neurons);
    for(size_t i = 0; i < neurons; i++)
    {
        network.neurons[i] = neuro_neuron_new();
    };
    return network;
};

void neuro_network_connect(struct_network * net1, struct_network *net2)
{
    net1->network_connections = realloc(net1->network_connections,sizeof(struct_network)*(net1->network_connections_size+1));
    net1->network_connections[net1->network_connections_size++] = net2;
    net2->network_connections = realloc(net2->network_connections,sizeof(struct_network)*(net2->network_connections_size+1));
    net2->network_connections[net2->network_connections_size++] = net1;
    for(size_t i = 0; i < net1->network_size; i++)
    {
        for(size_t p = 0; p < net2->network_size; p++)
        {
            neuro_neuron_connect(&net1->neurons[i],&net2->neurons[p]);
        };
    };
};


struct_net_union neuro_net_union_new()
{
    static size_t id=0;
    struct_net_union net_union;
    net_union.id=id++;
    net_union.networks=NULL;
    net_union.net_union_size=0;
    return net_union;
}

void neuro_net_union_add(struct_net_union * net_union, struct_network * network)
{
    net_union->networks = realloc(net_union->networks,sizeof(struct_network)*(net_union->net_union_size+1));
    net_union->networks[net_union->net_union_size] = network;
    net_union->net_union_size++;
}




#include "neuro.h"


int main(int argc, char const *argv[])
{

	struct_network  net1 = neuro_network_new(100);

	struct_network  net2 = neuro_network_new(100);

	neuro_network_connect(&net1,&net2);

	
	return 0;
}
gcc -g neuro.c main.c -o neuro

 , , ,

Dron
()

сопоставить данные акселерометра и магнитометра

Форум — Development

Есть показания акселерометра соответствующие им показания магнитометра, т.е. значения захвачены одновременно:

        64        192      15296       -515         97       -148
       -64        -64      15104       -516         96       -149
        64       -256      16832       -519         96       -151
Первые три - акселерометр, второе - магнитометр.

Можно сказать что один вектор тут смотрит вверх, второй тоже некий вектор, который уже ориентирован в другое место (как известно, магнитное поле идет под некими наклонами).

Задача: хочу на основании данных магнитометра получать (вычислять) вектор G, предварительно откалибровав связку акселерометр + магнитометр.

Вопрос: Как это сделать?

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

Отговорите от безумства, может можно математически сделать такое сопоставление? Может умные люди эту давно решенную задачу делают иными известными (не мне) методами? Как-то гуглил, тупо не нашел, то ли это жутко очевидно и я конкретно затупил...

 ,

I-Love-Microsoft
()

Программеру никто не пишет...

Форум — Talks

Итак, много лет болтается резюме, примерно такого содержания, но кроме унылых банков и тоскливых их аналогов, никто не пишет:

( читать дальше... )

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

 ,

Deleted
()

Пришло время менять проц? Видео не тянет? Будущее наступило

Форум — Talks

Как ваш проц справляется с данным видео? - http://demo-uhd3d.com/fiche.php?cat=uhd&id=144

С какими настройками открываете плеер? «Бутафорские ядра» AMD оказались как нельзя кстати?

Видимо, приближается время острой 8-ядерной необходимости!

 ,

Moderators
()

QTcpSocket в QThread

Форум — Development

Написал вначале QTcpSocket в основном потоке и было все великолепно, стал переносить в поток и понеслось по трубам. Сначала почему-то перестало подключаться по URL(только по IP), я удивился конечно, но думаю ладно. Потом передача данных перестала работать. Стал смотреть в чем дело, а оно только до ConnectingState стало доходить. На серваке accept срабатывает нормально, но передача данных - глухо. В инете советуют вызвать exec на текущем QThread, но когда я это делаю, то у меня сигналы перестают работать. :) Что за ерунда? Спасайте люди добрые.

 , ,

Booster
()

mc.ext и запуск исполнимых файлов

Форум — General

По умолчаниюв конце файла mc.ext прописано

default/*
  Open=
При таком описании Enter на исполнимом файле без распознанного расширения запускает этот файл на исполнение. Хочется в конце файла mc.ext прописать что-то вроде
default/*
  Open=screen -d -m xdg-open %f
Это должно обеспечить использование системных ассоциаций без нудного их переписывания в mc.ext. Но после этого никакие файлы по Enter не исполняются.

Можно ли как-то настроить mc, чтобы по Enter на файле с атрибутом «исполнимый» mc запускал этот файл, а не пытался его открывать в соответствии с расширением?

 ,

akorop
()

Помогите реализовать RTP протокол.

Форум — Development

Всем привет! Может подскажете как решить такую досадную проблему? Пишу небольшой RTP сервер для стриминга H.264 видео.

Предстала неизвестная проблема: через некторое время(20-30 секунд) перестает корректно воспроизводится стрим(картинка рассыпается). Я подозреваю, что как-то не так упаковываю кадры H.264 в RTP.

Кадры формируются аппаратным кодировщиком Raspberry Pi, работа с которым осуществляется через OpenMAX. Источник данных для кодировщика - камера. Ну, это собственно не так важно.

Полученыей кадр передаются небольшой нижележащей функции(send_data_to_rtp), которая пакует его в RTP. Принимает аргументы: data - указатель на изображение в памяти, len - размер изображения, framerate - колличество кадров в секунду.

// заголовки
	#define BUF_SIZE		1500
	#define RTP_PAYLOAD_MAX_SIZE	1400

	/* RTP ЗАГОЛОВОК. 12 байт */
	typedef struct{
		/* первый байт */
		uint8_t csrc_len: 	4;	
		uint8_t extension:	1;	
		uint8_t padding:	1;	
		uint8_t version:	2;	
		/* второй байт */
		uint8_t payload_type:  	7;	
		uint8_t marker:		1;	
		/* третий-четвертый байты */
		uint16_t seq_no;		
		/* пятый-восьмой байты */
		uint32_t timestamp;		
		/* девятый-двенадцатый байт */
		uint32_t ssrc;			
	}__attribute__ ((packed)) rtp_header;

	typedef struct {
		uint8_t type:		5;	
		uint8_t nri: 		2;	/*  */
		uint8_t f:		1;	/*  */
	}__attribute__ ((packed)) nalu_header;


	typedef struct {
		uint8_t type: 5;
		uint8_t nri: 2;
		uint8_t f: 1;
	} __attribute__ ((packed)) fu_indicator;


	typedef struct {
		uint8_t type: 5;
		uint8_t r: 1;
		uint8_t e: 1;
		uint8_t s: 1;
	} __attribute__ ((packed)) fu_header;

.......
// Формируем пакет
static void send_data_to_rtp(uint8_t *data, int len, int framerate)
{
	static uint8_t sendbuf[BUF_SIZE];
	static uint32_t ts_current = 0;
	static uint16_t seq_num = 0;
	static uint16_t pack_num, last_pack_size, current_pack;

	uint8_t *nalu_playload;
	/* заголовок RTP */
	rtp_header *rtp_hdr;
	/* Заголовок NALU */
	nalu_header *nalu_hdr;
	/* Заголовк NALU фрагментированых данных */
	fu_indicator *fu_ind;
	/* заголовк NALU фрагментированых данных. Идентифицирует фрагмент */
	fu_header *fu_hdr;

	ts_current += (90000 / framerate);

	memset(sendbuf, 0, sizeof(sendbuf));

	rtp_hdr = (rtp_header*)&sendbuf[0];
	
	rtp_hdr->version = 2;
	rtp_hdr->marker = 0;
	rtp_hdr->csrc_len = 0;
	rtp_hdr->extension = 0;
	rtp_hdr->padding = 0;
	rtp_hdr->ssrc = htonl(SSRC_NUM);
	rtp_hdr->payload_type = TYPE_H264;
	rtp_hdr->timestamp = htonl(ts_current);

	if (len <= RTP_PAYLOAD_MAX_SIZE) {
		rtp_hdr->marker = 1;
		rtp_hdr->seq_no = htons(++seq_num);

		nalu_hdr = (nalu_header*)&sendbuf[12];
		/* тип фрагмента */
		nalu_hdr->type = data[0] & 0x1f;
		nalu_hdr->f = data[0] & 0x80;
		nalu_hdr->nri = data[0] & 0x60 >> 5;

		nalu_playload = (uint8_t*)&sendbuf[13];
		/* Копирую буфер без ЗАГОЛОВКА(т.е. первого байта, являющийся заголовком NALU)! */
		memcpy(nalu_playload, data + 1, len-1);
		
		send_data_client(sendbuf, len + 13);
	} else {
		/* пакет не помещается в MTU, значит будем фрагментировать. 
		* Начало s = 1, e = r = 0
		* Середина s = 0, e = 0  r = 0
		* Конец s = 0, e = 1 r = 0
		*/
		/* определяю требуемое колличество пакетов */
		pack_num = (len % RTP_PAYLOAD_MAX_SIZE) ? (len / RTP_PAYLOAD_MAX_SIZE + 1) : (len / RTP_PAYLOAD_MAX_SIZE);
		/* размер данных в последнем пакете */
		last_pack_size = (len % RTP_PAYLOAD_MAX_SIZE) ? (len % RTP_PAYLOAD_MAX_SIZE) : (RTP_PAYLOAD_MAX_SIZE);

		current_pack = 0;

		/* описываю заголовки, которые используются на каждой иттерации */
		fu_ind = (fu_indicator *)&sendbuf[12];
		fu_ind->f = data[0] & 0x80;
		fu_ind->nri = (data[0] & 0x60) >> 5;
		/* говорим, что пакет у нас фрагментирован */
		fu_ind->type = 28;
		fu_hdr = (fu_header *)&sendbuf[13];
		fu_hdr->type = data[0] & 0x1f;
		
		while (current_pack < pack_num) {
			rtp_hdr->seq_no = htons(++seq_num);
			/* первый пакет */
			if(current_pack == 0) {
				/* начало фрагментированого блока */
				fu_hdr->s = 1, fu_hdr->e = 0, fu_hdr->r = 0;
				rtp_hdr->marker = 0;
				
				nalu_playload = (uint8_t*)&sendbuf[14];
				memset(nalu_playload, 0, RTP_PAYLOAD_MAX_SIZE);
				/* Копирую буфер без ЗАГОЛОВКА(т.е. первого байта, являющийся заголовком NALU)! */
				memcpy(nalu_playload, data + 1, RTP_PAYLOAD_MAX_SIZE);
				send_data_client(sendbuf, RTP_PAYLOAD_MAX_SIZE + 14);
			/* середина */
			} else if(current_pack < pack_num - 1){
				fu_hdr->s = 0, fu_hdr->e = 0, fu_hdr->r = 0;
				rtp_hdr->marker = 0;

				nalu_playload = (uint8_t*)&sendbuf[14];
				memset(nalu_playload, 0, RTP_PAYLOAD_MAX_SIZE);

				memcpy(nalu_playload, data + (current_pack * RTP_PAYLOAD_MAX_SIZE) + 1, RTP_PAYLOAD_MAX_SIZE);
				send_data_client(sendbuf, RTP_PAYLOAD_MAX_SIZE + 14);
			/* последний пакет */
			} else {
				rtp_hdr->marker = 1;
				nalu_playload = (uint8_t*)&sendbuf[14];
				fu_hdr->s = 0, fu_hdr->e = 1, fu_hdr->r = 0;
				memset(nalu_playload, 0, RTP_PAYLOAD_MAX_SIZE);

				memcpy(nalu_playload, data + (current_pack * RTP_PAYLOAD_MAX_SIZE) + 1, last_pack_size - 1);
				send_data_client(sendbuf, last_pack_size - 1 + 14);
			}
			current_pack += 1;
		}
	}
}




// Тут пишу в сокет.
static void send_data_client(uint8_t *send_buf, size_t len_sendbuf)
{
	sendto(socket_fd, send_buf, len_sendbuf, 0, (struct sockaddr *)&addr,sizeof(addr));
}

Один из фреймов выгялит след.образом: 0000 0001 2588 804f ec82 b9bf e0b7 1789 .....

До вызова функции send_data_to_rtp отсекаю 00 00 00 01. После заголовка RTP(12 байт) и еще двух байтов(заголовки для фрагментации) последовательность в готовом пакете выгядит так 88 804f ec82 b9bf e0b7 1789 .....

Данные фрейма в правильном порядке «растекаются» по пакетам(смотрел в вайршарке) ничего лишнего не копируется и не теряется. Следовательно вопрос: правильно ли я формирую заголовки пакетов?

При воспроизведении появляются ошибки, вида(проигрывал стрим в mplayer):

V:  22.3   0/  0 10%  1%  0.0% 0 0 
[h264 @ 0xb6497640]error while decoding MB 1 14, bytestream (-5)
[h264 @ 0xb6497640]concealing 68 DC, 68 AC, 68 MV errors
V:  22.3   0/  0 10%  1%  0.0% 0 0 
[h264 @ 0xb6497640]error while decoding MB 16 14, bytestream (-9)
[h264 @ 0xb6497640]concealing 53 DC, 53 AC, 53 MV errors
V:  22.6   0/  0 10%  1%  0.0% 0 0 
[h264 @ 0xb6497640]error while decoding MB 17 3, bytestream (-3)
[h264 @ 0xb6497640]concealing 272 DC, 272 AC, 272 MV errors
V:  22.7   0/  0 10%  1%  0.0% 0 0 

Буду премного благодарен за любой совет! Спасибо!

 , ,

batchar
()

Linux: показывать только черный экран при загрузке

Форум — Development

Можно ли настроить ядро Linux так, чтобы при запуске был исключительно черный экран, чтоб ни буквы на экран не вылезло?

И если это решает Plymouth, то можно ли это без него сделать?

P.S. Просто это прошивка устройства, у которого не должно ничего вылезать на экран, и лишь полностью загрузившись - появится картинка с логотипом, например...

I-Love-Microsoft
()

Выбран официальный клиент интернет-мессенджера Tox

Новости — Open Source
Группа Open Source

Разработчики мессенджера Tox, позиционируемого в качестве открытой, свободной, лишённой бэкдоров и не шпионящей за пользователями альтернативы Skype, учли критику со стороны сообщества, которая, в основном, относилась к путанице среди многочисленных клиентов и необходимости запоминать чрезмерно длинный идентификатор собеседника.

Из множества клиентов был выбран лучший. Им стал uTox. Готовые сборки доступны на странице загрузки (Win/Linux/Mac, Android, iOS). Ведётся разработка реализации протокола Tox для популярных открытых мессенджеров Pidgin и Miranda.

Кроме того, разработан и утвержден стандарт DNS Discovery. Теперь, любой пользователь может зарегистрировать адрес вида nick@domain.net. Уже введены в строй два сервиса для регистрации - utox.org и toxme.se

>>> Подробности

 ,

anonymous
()

Нубас-жыробас ищет FPGA-развлечений

Форум — Talks

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

Так как Texas Instruments умудрились взрастить во мне лояльного пользователя, но при этом не делают FPGA-шек назрел вопрос:

что брать?

Исходные данные для решения:
- максимум 5-6 тыс. руб. РФ
- конкретные FPGA знания стремительно идущие к нулю (но я дергал сразу ДВЕ лампочки на msp430 launchpad)

Хочется:
- воткнул и гордишься тем, что ты теперь крутой крутой «работаешь»
- доступность достаточного объема туториалов/доков (англ/рус не важно)

Жду советов и рекомендаций

 ,

nerfur
()

FPGA для начинающих программистов

Форум — Linux-hardware

Расскажите, пожалуйста, сколько стоит купить FPGA, какие модели подойдут, как их подключать (в составе отладочной платы через USB ?), бывают ли отладочные платы с памятью на борту, как их программировать, почему они будут работать быстрее по сравнению с процессором общего назначения, если узкими местами являются разные шины и ввод-вывод (тот же USB)?

Что такого ещё могут FPGA для задач обработки текстов, чего нельзя запрограммировать для GPU на OpenCL ?

deadline-multishiva
()

ЗАО НТЦ «Модуль» опубликовал исходные коды системного ПО для микрокомпьютера МВ77.07 на хостинге открытых проектов github

Новости — Hardware and Drivers
Группа Hardware and Drivers

В комплект опубликованного в исходных кодах ПО входят:

  • Ядро Linux версии 3.10.
  • Отладочный инструмент edcltool.
  • Исходные коды загрузчика mboot.
  • Утилиты для работы с VDU.
  • Конфигурация для crosstool-ng.
  • Сценарии для генерации образов debian и raspbian.
  • Примеры программ для Neuromatrix DSP.
  • Набор инструментов для Neuromatrix DSP (компилятор С/С++, ассемблер, документация).

Дальнейшие обновления ПО будут размещаться по мере появления на github-аккаунте ЗАО НТЦ «Модуль», туда же можно написать об обнаруженных проблемах или прислать свои патчи.

Библиотеки для работы с аппаратным декодером видео будут доступны немного позже в этом месяце.

Приобрести микрокомьютер МВ77.07 можно здесь.

>>> Страница проекта на GitHub

 , , ,

ncrmnt
()

Ядро linux для начинающих и интересующих

Форум — Development

Думаю, наверняка есть люди, которые сейчас осваивают программирование под ядро или драйверы, и которым были бы интересны полезные советы по этому поводу от человека, который занимается ядром профессионально.

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

Я занимаюсь этим делом порядка 3.5 лет, рассказать есть что. Вопрос в том, кто будет это читать. Когда я работал в школе и вел кружок углубленной математики по программе Малого Мех-мата, то на него ходило 4 человека из всей параллели. Для интернет блога такое число будет слишком маленьким, даже для 10 читателей что-либо затевать смысла нет, это будет неинтересно.

Собственно, дайте знать, кому это интересно. И тогда можно будет оценить целесообразность.

Площадка, думаю, может быть, любая, ЖЖ или там вконтактик, сейчас не суть.

ttnl
()

Библиотеки для инерциальной навигации - какие есть?

Форум — Development

Существуют ли универсальные (или популярные) библиотеки для обработки данных с гироскопов и акселерометров? Которые были бы написаны вне привязки к какому-то продукту или производителю?

Чтобы не париться с объединением результатов акселерометра, гироскопа и прочих? Вдруг есть готовое решение? Я пока такое не могу найти.

I-Love-Microsoft
()

Тиринг на nvidia GTX 650

Форум — Desktop

На компизе тиринга нет, на остальных wm присутствует(тестил 4 штуки), особенно заметно при просмотре видео.

Так вот, можно ли как-то избавиться от этой проблемы, скажем прикрутив композитинг к тому же awesome?

Слышал что в новом mutter пофиксили это дело, но гномом пользоваться противно и не удобно.

 , ,

ritsufag
()

Портирование ядра. Написал драйвер UART как корректно его подключить.

Форум — Mobile

Здравствуйте. Я пытаюсь портировать ядро линукс на процессор SPMP8000 (основан на arm926). Я написал свой драйвер ЮАРТ (пока сильно упрощенный вариант). Вот код драйвера:

#include <linux/console.h>
#include <linux/serial_core.h>
#include <asm/io.h>
#include <mach/serial.h>

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/smp.h>
#include <linux/termios.h>
#include <linux/amba/bus.h>
#include <linux/amba/serial.h>
#include <linux/io.h>
#include <mach/platform.h>
#include <mach/hardware.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>
#include <asm/mach/irq.h>
#include <asm/mach/map.h>
#include <asm/mach/time.h>




//запись символа в юарт0
static void putc(int c)
{
        int timeout=4000;

        if (UART0_STATUS1 & 0x1E) return;
        while (timeout > 0) {
                if ((UART0_STATUS2 & 0x10) && ((UART0_STATUS3 & 4) == 0)) {
                        UART0_DATA = c;
                        break;
                }
                timeout--;
        }
}

// функция printk в  ЮАРТ
static void sanoprintk(struct console *co, const char *s, u_int count){
    int i;
        /* Пишем каждый символ */
        for (i = 0; i < count; i++, s++) {
                if (*s == '\n'){
                        putc('\r');
                }
                putc(*s);
        }
}


static int __init sano_console_setup(struct console *co, char *options)
{
        return 0;
}


/* Заполняем структуру консоли */

static struct console sano_uart_console = {
            .name   = "ttyS",                /* Имя консоли */
            .write  = sanoprintk, /* Как делать printk в консоли */
//          .device = uart_console_device,    /* Предоставлена ядром serial */
            .setup  = sano_console_setup,
            .flags  = CON_PRINTBUFFER,        /* Флаг по умолчанию */
            .index  = -1,                     /* Инициализация в неправильное значение */
};
//register_console(&sano_uart_console);


/* Инициализация консоли */

static int __init sano_uart_console_init(void)
{
/* Регистрация этой консоли */
register_console(&sano_uart_console);
return 0;
}

console_initcall(sano_uart_console_init); /* Метка инициализации консоли */

В Makefile arch части добавил obj-y += serial.o, ядро собирается и драйвер в его добавляется, но вывод сообщений в ЮАРТ не происходит.

Однако если я в файде /init/main.c добавляю свою функцию sanoprintk , а так же заполняю и инициализирую структуру static struct console sano_uart_console прямо в начале функции start_kernel, то вывод в юарт работает так как надо. Выглядит это примерно так

#ifdef STANDALONE_DEBUG
#define putstr printf
#else

static void sanoprintk(struct console *co, const char *s, u_int count);

#include <mach/uncompress.h>
#endif

static void sanoprintk(struct console *co, const char *s, u_int count){
    int i;
        /* Пишем каждый символ */
        for (i = 0; i < count; i++, s++) {
                if (*s == '\n'){
                        putc('\r');
                }
                putc(*s);
        }
}

asmlinkage void __init start_kernel(void)
{
/* Параметры каждого из поддерживаемых портов USB_UART */
        /* Заполняем структуру консоли */

static struct console sano_uart_console = {
          .name   = "ttyS",                /* Имя консоли */
          .write  = sanoprintk, /* Как делать printk в консоли */
          .flags  = CON_PRINTBUFFER,        /* Флаг по умолчанию */
          .index  = -1,                     /* Инициализация в неправильное значение */
};
register_console(&sano_uart_console);

Однако, это крайне не верное решение. Подскажите пожалуйста как подключить драйвер вынесенный в отдельный файл arch части ядра.

 spmu8000, ,

Sanoend
()

QGtkStyle was unable to detect the current GTK+ theme

Форум — Desktop

Установил тему gtk: для этого сделал emerge x11-themes/gtk-engines после чего отредактировал на свой вкус /usr/share/themes/Clearlook/gtk-2.0/gtkrc и написал в ~/.gtkrc-2.0 такую строчку: gtk-theme-name=«Clearlooks». Полученное понравилось, решил попытаться настроить внешний вид qt. С этим возникли проблемы: находились только темы kde, а не qt. Впрочем, я решил, что лучше пусть они выглядят одинаково. Для этого запускаю qtconfig и выбирию в списке gtk. но вместо этого вид становится только более убогим, а на консоль вылетает сообщение

QGtkStyle was unable to detect the current GTK+ theme.

Гугление по нему выдаёт только коммит в систему контроля версий qt, когда этот варинг был туда включён. Как решить проблему нигде не нашёл.

tot-to
()

Управление яркостью экрана на буках Samsung (300V5*, 300E5*...)

Форум — Talks

(Или немного о пользе чтения сорцов и бесполезности гугла.)

Выложу тут решение, может кому пригодится.

На ноутах самсунга (как минимум, на линейках 300V5* И 300E5*, но наверное и на многих других) глючит управление яркостью подсветки дисплея. При чем, глючит и стандартный acpi-шный модуль, и модуль samsung_laptop (который используется, если ядру при загрузке сказать acpi_backlight=vendor). На первом не обновляется текущее значение яркости в /sys/class/backlight/acpi_video0/actual_brightness, а второй вообще работает как попало.

Из-за этого (из-за нерверного значения actual_brightness), в частности, не работают команды xbacklight -dec и xbacklight -inc.

Как это быстро исправить, не хакая драйвера? Если мы посмотрим в /sys/class/backlight/, увидим там два интерфейса управления подсветкой:

~$ ls /sys/class/backlight/
acpi_video0  intel_backlight
Так вот первый глючный, а второй вполне себе работает. Но в драйвере xf86-video-intel интерфейс acpi_video0 считается более приоритетным. Что надо сделать? Создать файл /etc/X11/xorg.conf.d/99-backlight.conf и вписать туда:

Section "Device"
	Identifier  "Card0"
	Driver      "intel"
	BusID       "PCI:0:2:0"
	Option      "Backlight"   "intel_backlight"
EndSection

И перезапустить иксы. Всё.

 ,

geekless
()

Субтитры в разных кодировках в mplayer

Форум — Multimedia

Возможно ли настроить автоопределение кодировки субтитров?

если ставлю

subcp = "cp1251"
то каракули с utf8 и наоборот.

 , ,

xangervi
()