LINUX.ORG.RU

собираешь модуль w1-gpio, вешаешь на gpio и сверху наворачиваешь либо юзерспейсный софт, либо ядрёный драйвер.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

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

edu08
() автор топика
Ответ на: комментарий от Dark_SavanT

у меня ядро 3.10.28 i2c там по умолчанию включен но что-нибудь типа W1_MASTER_GPIO=Y (1wire bus master) W1_SLAVE_THERM=Y (Thermal family implementation) там нет есть вот это # # USB GPIO expanders: # # CONFIG_W1 is not set # CONFIG_THERMAL is not set

то ли это ?

edu08
() автор топика
Ответ на: комментарий от edu08

UPD: точнее даже не так

CONFIG_W1 - это в принципе 1-wire поддержка. там будет что-то типа CONFIG_W1_GPIO, это то что тебе надо модулем собрать.

menuconfig в помощь.

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

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от ncrmnt

Собрал модули w1-gpio и w1-therm . Не пойму как собрать или привязать к конкретному gpio типа: w1-gpio-custom bus0=0,2,0

edu08
() автор топика
Ответ на: комментарий от edu08
root@shadow:~#  lsmod                                                                                                   
Module                  Size  Used by                                                                                               
w1_therm                2185  0                                                                                                     
w1_gpio                 2193  0                                                                     
                               
root@shadow:~#  echo "ds18b20" 0x28 > /sys/bus/i2c/devices/i2c-0/new                                                    
[  780.340000] i2c i2c-0: new_device: Instantiated device ds18b20 at 0x28

root@shadow:~#  more /sys/class/i2c-adapter/i2c-0/0-0028/name                                                           
ds18b20                                                                                
 

root@shadow:~# ls /sys/class/i2c-adapter/i2c-0                                                                         
0-0028  0-006a         device   name        subsystem                                                                               
0-0061  delete_device  i2c-dev  new_device  uevent   

root@shadow:~#  more /sys/class/i2c-adapter/i2c-0/0-0028/name                                                           
ds18b20                                                             

Тут ничего нет естественно 
root@shadow:~# ls /sys/bus/w1/devices/                                                                                              
root@shadow:~# 
                  

Где то привязать пин gpio надо ...

edu08
() автор топика
Ответ на: комментарий от edu08

А при чём тут i2c?

Если ты собираешь своё ядро, то в dts к борде допиши по образу и подобию: http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/w1/w1-...

Если нет, то берёшь, например из openwrt https://dev.openwrt.org/browser/trunk/package/w1-gpio-custom/src/w1-gpio-cust... и собираешь драйвер w1-custom-gpio который поднимет тебе 1-wire мастера на некотором gpio. где bus0=0,x,0 где x - номер gpio в системе. Как его узнать - отдельный квест, в котором ncrmnt тебе лучше поможет.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

Да, что то я совсем запутался. Никогда раньше не работал ни с i2c ни c 1-wire. Похоже в голове «заварилась каша» ... 8-) Поэтому и пришел за советом.

Зачем тогда подгружать модуль i2c-dev и ставить i2c-tools ?

Прописывание в dts файле следующих строк

...	
		ethernet: greth@4000 {
				local-mac-address = [ 00 02 f7 00 27 0f ];
				status = "okay";
				mdio {
					phy0: ethernet-phy@0 {
						reg = <0x1f>;
					};
				};
			};
		};		
	};

	onewire@0 {
                 compatible = "w1-gpio";
                 gpios = <&gpio 4 0>;
         };

};

&ssp1 {
	status = "okay";
	spidev@0 {
...

даёт ошибку при компиляции. Без этих строк - всё ОК.

Возможно, что я что то не так делаю при кросс-компиляции.

...
  CC      net/sunrpc/rpcb_clnt.o
  LD      lib/built-in.o
  DTC     arch/arm/boot/dts/module-mb7707.dtb
ERROR (phandle_references): Reference to non-existent node or label "gpio"

ERROR: Input tree has errors, aborting (use -f to force output)
make[1]: *** [arch/arm/boot/dts/module-mb7707.dtb] Ошибка 2
make: *** [dtbs] Ошибка 2
make: *** Ожидание завершения заданий…
  CC      net/unix/af_unix.o
  CC      net/sunrpc/timer.o
...

Ладно, пока попробую w1-custom-gpio поковырять ...

edu08
() автор топика
Ответ на: комментарий от edu08

ERROR (phandle_references): Reference to non-existent node or label «gpio»

тебе всё сказали, ты к несуществующему phandle обращаешься, скорее всего цифру на конце забыл.

https://github.com/RC-MODULE/linux-3.10.x/blob/k1879-3.10.28/arch/arm/boot/dt...

тут можно посмотреть какие gpio контроллеры есть. gpio_* или gpiofj. Зависит от того как плата разведена.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 2)
Ответ на: комментарий от ncrmnt

Почитал доки, кажется разобрался с dts и dtsi. Собрал ядро, откомпилил, собрал модули. Всё это влил на борд.

модули зарузил

root@shadow:~#  lsmod                                                                                                   
Module                  Size  Used by                                                                                               
w1_therm                2185  0                                                                                                     
w1_gpio                 2193  0  

Теперь всё грузится без ошибок и ... не работает :-(

Вижу что система файлов w1 появилась, опросы идут, счетчик считает:

  
root@shadow:~# cat  /sys/bus/w1/devices/w1_bus_master1/w1_master_attempts       
29  

а датчик не видит. Сам датчик ножкой DATA включен на 19 ногу разъема Х9, что соответствует GPIO 4, POWER - 2 нога(3,3 вольта), GROUND - 39 нога(земля).

 root@shadow:~# cat  /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves         
not found.                                                              

Сам датчик исправен, т.к. подключал его на Pi B и там он работает и показывает значения.

Ниже привожу куски моих module-mb7707.dts и module-k1879x.dtsi

module-mb7707.dts

				clock-output-names = "clk_27m";
			};

			ethernet: greth@4000 {
				local-mac-address = [ 00 02 f7 00 27 0f ];
				status = "okay";
				mdio {
					phy0: ethernet-phy@0 {
						reg = <0x1f>;
					};
				};
			};

			onewire@0 {
				 compatible = "w1-gpio";
				 gpios = <&gpio_5 4 0>;
			 };

		};		
	};

};

&ssp1 {

module-mb7707.dts

	};

			gpio_4: gpio@5000 {
				#gpio-cells = <2>;
				compatible = "arm,pl061", "arm,primecell";
				gpio-controller;
				reg = <0x5000 0x1000>;
				interrupt-parent = <&vic1>;
				interrupts = <26>; /* 58 */
				clocks = <&clk_apb>;
				clock-names = "apb_pclk";
			};

			gpio_5: gpio@6000 {
				#gpio-cells = <2>;
				compatible = "arm,pl061", "arm,primecell";
				gpio-controller;
				reg = <0x6000 0x1000>;
				interrupt-parent = <&vic0>;
				interrupts = <27>; /* 27 */
				clocks = <&clk_apb>;
				clock-names = "apb_pclk";
			};

			crypto0: des@d000 {
				compatible = "module,mcrypto";
				reg = <0xd000 0x1000>;
				interrupt-parent = <&vic1>;
				interrupts = <8>; /* 40 */
			};

что я делаю не так? ПоможИте чем можИте ...

edu08
() автор топика
Ответ на: комментарий от edu08

Посмотри осциллографом линию данных, есть ли там хоть что-то

Dark_SavanT ★★★★★
()
Ответ на: комментарий от anonymous

Подтяжка 4.7 кОм между POWER и DATA есть. Проверил датчик на Pi B - работает.

Подцепился оосциллографом - тишина как и на других рядом расположенных ножках GPIO.

Может косяк с ядром 3.10.28 и поменять его на 3.10.90 ?

Драйвер поддерживает датчик ds18b20, вот кусок описания модуля w1_therm к датчику:

Kernel driver w1_therm
====================

Supported chips:
  * Maxim ds18*20 based temperature sensors.
  * Maxim ds1825 based temperature sensors.

Author: Evgeniy Polyakov <johnpol@2ka.mipt.ru>


Description
-----------

w1_therm provides basic temperature conversion for ds18*20 devices.
supported family codes:
W1_THERM_DS18S20	0x10
W1_THERM_DS1822		0x22
W1_THERM_DS18B20	0x28
W1_THERM_DS1825		0x3B

Support is provided through the sysfs w1_slave file.  Each open and
read sequence will initiate a temperature conversion then provide two
lines of ASCII output.  The first line contains the nine hex bytes
read along with a calculated crc value and YES or NO if it matched.
If the crc matched the returned values are retained.  The second line
displays the retained values along with a temperature in millidegrees
Centigrade after t=.
...

edu08
() автор топика
Ответ на: комментарий от edu08

тишина как и на других рядом расположенных ножках GPIO.

Значит ты неправильный gpio написал в dts. Либо ещё есть вариант, что на этот пин мультиплекснута периферия, а не IO. Смотри в сторону pinctrl

Dark_SavanT ★★★★★
()
Ответ на: комментарий от edu08

На 3.10.90 у меня та же самая ситуация, GPIO никак не реагируют на манипуляции в sysfs — такое ощущение, что номера GPIO не совпадают с указанными в руководстве, путаница какая-то. Пробовал по разным номерам искать, нашёл только GPIO16 на ножке 14. Написал по этому поводу в «Модуль», пока не ответили.

Может, нумерация X9 какая-то особенная? Я как на Raspberry считал: ножка 2 над 1, 3 справа от 1, 4 над 3 и т.д.

aclex
()
Ответ на: комментарий от aclex

to aclex:

Документации и примеров реализации по МВ77 очень мало. НЕ сравнить с Raspberry. Поэтому любая реализация задуманного на этом железе идёт со скрипом и особенно для начинающего. Да и на форуме поддержка не высокая. Но что делать, «чем сильнее враг тем, интереснее война».

Подробная распиновка разъёма X9 доступна в таблице по ссылке: http://www.module.ru/mb7707/doc/MB77.07-X9-pinout.pdf

Когда я просто дёргаю ножки gpio через sysfs со светодиодом на них, то вижу распиновка совпадает с таблицей.

Если я правильно понимаю GPIO здесь два разных типа. Первый тип, это те, что выведены на гребенку с 16 по 23 ножки на X9. Второй на X9 тип с 7 по 14 ножки (можно мультиплексировать в GPIO). Ножки 4,5,6 в руководстве по эксплуатации (http://module.ru/upload/files/rukmk.pdf) указаны как GPIO, но по таблице - не управляемые.

Оба типа имеют другие номера в самой системе (в Linux) и могут быть сконфигурированы для работы с прерываниями к ARM ядру. Я так понимаю что привязка к прерываниям делается в module-k1879x.dtsi.

Именно линуксовые номера по таблице и надо использовать при работе с gpio через sysfs.

Так можно дёргать физическую ногу 16 на Х9 (в Linux по таблице она 31):

root@shadow:~# echo 31 > /sys/class/gpio/export                                
root@shadow:~# echo out > /sys/class/gpio/gpio31/direction                      
root@shadow:~# echo 1 > /sys/class/gpio/gpio31/value      

Выше я приводил два куска файлов dts и dtsi из которых получается dtb. Только второй кусок из файла module-k1879x.dtsi, а не из module-mb7707.dts (опечатался).

Если я в чем то ошибаюсь поправьте меня плиз.

edu08
() автор топика
Ответ на: комментарий от Dark_SavanT

Пересобрал ядро уже не вручную, а через menuconfig. В резульлате lsmod показал немного другую картину, я думаю более правильную. Появился модуль wire с зависимостью с w1_gpio и w1_therm

root@shadow:~# lsmod                                                            
Module                  Size  Used by                                           
w1_therm                2193  0                                                 
w1_gpio                 2201  0                                                 
wire                   17603  2 w1_gpio,w1_therm                                
root@shadow:~# rmmod wire                                                       
Error: Module wire is in use by: w1_gpio w1_therm                               
root@shadow:~# 

Но результат от этого не изменился

Значит ты неправильный gpio написал в dts.

в dts перебрал все gpio и gpiofj что указаны в dtsi, перебрал все возможные варианты с пинами - толку никакого. Единственно что заметил при указании в dts номера пина Linux, а не номера GPIO и ссылаясь в

gpios = <&gpio_5 28 0>;

на phandle в dtsi с прописанным прерыванием

gpio_5: gpio@6000 {
  ...
 interrupts = <27>; /* 27 */
  ...
система при загрузке w1_gpio модуля ругается на неправильный gpio и сыпет ошибки.

....
[    9.580000] Driver for 1-wire Dallas network protocol.                       
[    9.590000] ------------[ cut here ]------------                             
[    9.600000] WARNING: at drivers/gpio/gpiolib.c:126 gpio_to_desc+0x20/0x44()  
[    9.610000] invalid GPIO -517                                                
[    9.620000] Modules linked in:                                               
[    9.620000] CPU: 0 PID: 1 Comm: swapper Not tainted 3.10.28-shadow1 #8       
[    9.630000] [<c00123c4>] (unwind_backtrace+0x0/0x118) from [<c0010e1c>] (show
_stack+0x10/0x14)                                                               
[    9.640000] [<c0010e1c>] (show_stack+0x10/0x14) from [<c001ae4c>] (warn_slowp
ath_common+0x4c/0x68)                                                           
[    9.650000] [<c001ae4c>] (warn_slowpath_common+0x4c/0x68) from [<c001ae94>] (
warn_slowpath_fmt+0x2c/0x3c)                                                    
[    9.660000] [<c001ae94>] (warn_slowpath_fmt+0x2c/0x3c) from [<c018ed5c>] (gpi
o_to_desc+0x20/0x44)                                                            
[    9.670000] [<c018ed5c>] (gpio_to_desc+0x20/0x44) from [<c018fb84>] (gpio_req
uest+0xc/0x18)                                                                  
[    9.680000] [<c018fb84>] (gpio_request+0xc/0x18) from [<c0265114>] (w1_gpio_p
robe+0xd8/0x230)                                                                
[    9.690000] [<c0265114>] (w1_gpio_probe+0xd8/0x230) from [<c01ddd0c>] (driver
_probe_device+0x118/0x300)                                                      
[    9.700000] [<c01ddd0c>] (driver_probe_device+0x118/0x300) from [<c01ddfa0>] 
(__driver_attach+0x68/0x8c)                                                     
[    9.710000] [<c01ddfa0>] (__driver_attach+0x68/0x8c) from [<c01dc2a8>] (bus_f
or_each_dev+0x6c/0x90)                                                          
[    9.720000] [<c01dc2a8>] (bus_for_each_dev+0x6c/0x90) from [<c01dd37c>] (bus_
add_driver+0x100/0x240)                                                         
[    9.730000] [<c01dd37c>] (bus_add_driver+0x100/0x240) from [<c01de2b0>] (driv
er_register+0x9c/0x120)                                                         
[    9.740000] [<c01de2b0>] (driver_register+0x9c/0x120) from [<c0008674>] (do_o
ne_initcall+0xb4/0x160)                                                         
[    9.750000] [<c0008674>] (do_one_initcall+0xb4/0x160) from [<c04b1a90>] (kern
el_init_freeable+0xf0/0x1b0)                                                    
[    9.760000] [<c04b1a90>] (kernel_init_freeable+0xf0/0x1b0) from [<c033f870>] 
(kernel_init+0x8/0xe4)                                                          
[    9.770000] [<c033f870>] (kernel_init+0x8/0xe4) from [<c000df58>] (ret_from_f
ork+0x14/0x3c)                                                                  
[    9.780000] ---[ end trace 3be66519f7f974f4 ]---                             
[    9.790000] gpiod_request: invalid GPIO                                      
[    9.800000] w1-gpio onewire.8: gpio_request (pin) failed                     
[    9.810000] w1-gpio: probe of onewire.8 failed with error -22   
....    

я не совсем понимаю содержимое файла в dtsi и как правильно прописать нужный phandle. Чтение доков и гугленье пока четкой ясности не дали.

Возможно по умолчанию там не прописан правильно именно тот который нужен.

edu08
() автор топика
Ответ на: комментарий от edu08

Смотри, чтобы определить phandle тебе нужно сделать примерно следующее:

определиться с gpio, допустим 31, найти к какому gpiochip он принадлежит, идёшь в /sys/class/gpio и смотришь какой gpiochip имеет наиболее близкий номер из меньших.

пример:

# ls /sys/class/gpio/
GSM_POWER      SIM1_PRES      USB_POWER      gpiochip32     unexport
RE             SIM2_PRES      export         gpiochip64
RS485_PRESENT  SIM_SELECT     gpiochip0      gpiochip96
# 

Это с моей рабочей борды, на вообще другом чипе. Допустим тебе нужен gpio с номером 38. Смотрим что есть, ближайший будет gpiochip32.

дальше делаем:

# cat /sys/class/gpio/gpiochip32/device/uevent 
DRIVER=gpio-at91
OF_NAME=gpio
OF_FULLNAME=/ahb/apb/pinctrl@fffff400/gpio@fffff600
OF_COMPATIBLE_0=atmel,at91rm9200-gpio
OF_COMPATIBLE_N=1
OF_ALIAS_0=gpio1
MODALIAS=of:NgpioT<NULL>Catmel,at91rm9200-gpio
# 

видим нечто типа OF_ALIAS_0, это будет тем, что нужно запихать в phandle. Дальше считаешь какой его номер - (36-32 = 4) т.е. номер gpio минус gpio base number.

в phandle соответственно пишешь что-то типа <&gpio1 4 0>

Как-то так.

ncrmnt Это кстати тебе на вид, что по вашей таблице, если не знать про кишки подсистемы gpio ни разу не ясно что и откуда брать для phandle

Dark_SavanT ★★★★★
()
Ответ на: комментарий от edu08

to edu08: Спасибо большое Вам за подробные разъяснения, совсем не замечал нижнюю таблицу в документе с распиновкой (http://www.module.ru/mb7707/doc/MB77.07-X9-pinout.pdf), теперь всё встало на свои места. И Ваш пример с 16-й ногой у меня заработал.

Информации о MB77.07 действительно иногда недостаёт, чаще всего какие-то ценные вещи здесь, на LOR'е, находятся. Но да, проект, на мой взгляд, интересный, несмотря на некоторые трудности.

aclex
()
Ответ на: комментарий от Dark_SavanT

Уважаемый Dark_SavanT ! С Вашей помощью я наконец то победил 1-wire датчик.

Большое спасибо, хороший человек !!!

Прыгаю от радости и удовольствия. Получил большой опыт для себя. Оказывается, я ещё просто не понимал архитектуру GPIO и нумерацию ножек по чипам. Ловил сигнал не на той ноге. У тебя там небольшие опечатки с нумерацией, но всё и так понятно стало.

На МВ77 формат в dts и dtsi немного отличается от твоего, поэтому ниже излагаю что и как я сделал у себя . Может кому пригодится.(«Даром получили, даром и отдавайте»)

Собираем, например, модулями.

В ядре включил

Device Drivers ---> <M> Dallas's 1-wire support --->

1-wire Bus Masters ---> <M> GPIO 1-wire busmaster

1-wire Slaves ---> <M> Thermal family implementation

Далее по аналогии я сделал изменения в dts.

Допустим, подключаем датчик на физ. ножку Х9 № 19. Смотрим по таблице что в Linux это номер 28.

даем команду

root@shadow:~# ls /sys/class/gpio/                                              
export  gpiochip0  gpiochip16  gpiochip24  gpiochip32  gpiochip8  unexport 

В каждом чипе, я понял, нумерация начинается сначала, следовательно Linux GPIO номер 28 сидит на gpiochip24 («gpiochip имеет наиболее близкий номер из меньших»).

Следовательно на gpiochip24 это номер 4 (28-24=4).

Смотрим

root@shadow:~# cat /sys/class/gpio/gpiochip24/device/uevent                     
DRIVER=pl061_gpio                                                               
OF_NAME=gpio                                                                    
OF_FULLNAME=/axi/apb_c/gpio@a000                                                
OF_COMPATIBLE_0=arm,pl061                                                       
OF_COMPATIBLE_1=arm,primecell                                                   
OF_COMPATIBLE_N=2                                                               
AMBA_ID=00041061                                                                
MODALIAS=amba:d00041061    

Смотрим в файле module-k1879x.dtsi какой алиас имеет gpio@a000 из параметра OF_FULLNAME.

Ага, это - gpio_a. И он находится в разделе /axi/apb_c .

Открываем файл module-mb7707.dts и прописываем в axi

		apb_c {

			onewire: onewire@0 {
				compatible = "w1-gpio";
				gpios = <&gpio_a 4 0>;
			 };

Что бы было понятнее в каком месте файла разместить привожу пример с привязкой ниже

	 leds {
	     compatible = "gpio-leds";
	     one {
	     	  label = "mb7707::led1";
		  gpios = <&gpiofj 31 0>; /* LED1 */
		  linux,default-trigger = "heartbeat";
	     };
	     two {
		  label = "mb7707::led2";
		  gpios = <&gpiofj 30 0>; /* LED2 */
		  default-state = "off";
	     };
        };

	axi {

		apb_c {

			onewire: onewire@0 {
				compatible = "w1-gpio";
				gpios = <&gpio_a 4 0>;
			 };
	};
		apb_d {

			clk_core: clk@0 {
				/* Reference 324MHz clock */
				compatible = "fixed-clock";
				#clock-cells = <0>;
				clock-frequency = <324000000>;
				clock-output-names = "clk_core";
			};

Сохраняем файл и кросс-компилим ядро и модули. Вливаем на борд module-mb7707.dtb, uImage и модули. Перегружаем борд с подключенным датчиком и смотрим сообщения dmesg. Если появилось типа

[   37.711200] Driver for 1-wire Dallas network protocol.                       
[   38.088195] w1_master_driver w1_bus_master1: Family 28 for 28.000007e44016.23
 is not registered.  

Смотрим что появилось устройство 28-....

root@shadow:~# ls /sys/bus/w1/devices/                                          
28-000007e44016  w1_bus_master1                                                 
root@shadow:~# 

Проверяем подгруженные модули

root@shadow:~# lsmod                                                            
Module                  Size  Used by                                           
w1_gpio                 2201  0                                                 
wire                   17603  1 w1_gpio                                         
root@shadow:~# 

Ага, не хватает драйвера датчика - модуля w1_therm.

Загружаем его

root@shadow:~# modprobe w1_therm                                                
root@shadow:~# lsmod
Module                  Size  Used by                                           
w1_therm                2193  0                                                 
w1_gpio                 2201  0                                                 
wire                   17603  2 w1_gpio,w1_therm                                
root@shadow:~# 

Смотрим температуру

root@shadow:~# cat /sys/bus/w1/devices/28-000007e44016/w1_slave                 
83 01 4b 46 7f ff 0d 10 66 : crc=66 YES                                         
83 01 4b 46 7f ff 0d 10 66 t=24187                                              
root@shadow:~# 

На этом всё. А я иду радоваться и пить чай с чучиками ...

edu08
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.