- Evde monte edilebilecek minimal bir bilgisayar hedeflenerek Debian Linux, vi, gcc ve make çalıştırabilen 8 MB RAM’li, 1 MIPS sınıfı bir sistem yalnızca 8 pinli bileşenlerle gerçekleştirildi
- Nihai kart STM32G031, 8 MB SPI PSRAM ve PL2303GL USB-seri köprüsü olmak üzere 3 çipten oluşuyor; 8 pinli paket kısıtı nedeniyle kullanılabilen I/O sayısı yalnızca 6
- Pin yetersizliği tasarımın temel zorluğu; RAM normal SPI, SD kart RAM pinlerini paylaşan 1-bit SDIO, UART gönderimi ise bit banging ile ele alınıyor
- Yazılımda mevcut ARMv6M assembly tabanlı MIPS emülatörü yeniden kullanılıyor; 8 KB bootloader, SD kart FAT dosya sistemindeki FIRMWARE.BIN ile firmware’i güncelliyor
- STM32G031, VOS0 ayarıyla resmi 64 MHz’in üzerine overclock ediliyor; 148 MHz host CPU’da yaklaşık 1,65 MHz MIPS R3000 düzeyinde Debian’ı yaklaşık 1 dakika içinde başlatıyor
Yalnızca 8 pinli çiplerle yapılmış minimal Linux bilgisayarı
- Amaç, evde kolayca monte edilebilen kit tipi modern bir bilgisayarı yalnızca 8 pinli çiplerle yapmak
- Modern bilgisayar için asgari ölçüt Debian Linux, vi, gcc ve make çalıştırabilme olarak belirlendi
- Önceki deneylere dayanarak Linux çalıştırmak için gereken minimum özellikler 8 MB RAM ve 1 MIPS CPU olarak ayarlandı
- Depolama için SD kart, konsol bağlantısı için USB-seri kullanılıyor
- Kart küçük ve yuvarlak formda; üst kısmında kart kenarı tipi USB-C konektörü bulunuyor
- Lehimleme deneyimi neredeyse olmayan kişilerin bile 45 W lehim havyasıyla monte edebilmesi için bileşen sayısı ve pin sayısı azaltıldı
Bileşen seçimi
- USB bağlantısı için PL2303GL seçildi
- Harici bileşen gerektirmeden çalışan bir USB-seri köprüsü ve ayrıca 100 mA’lik 3,3 V regülatör çıkışı sağlıyor
- Başlıca işletim sistemleri için sürücüleri var; macOS’te App Store üzerinden kurulum gerekiyor
- Alternatif olarak ATTINYx5 ve V-USB ile USB uygulaması da değerlendirildi
- USB low-speed, spesifikasyona göre bulk endpoint kullanamaz; ancak başlıca işletim sistemleri bunu zorunlu tutmadığından ACM seri port uygulaması çalışıyor
- V-USB CPU zamanı, flash ve RAM’i fazla kullandığı için bu proje açısından ağır bir yük
- RAM olarak SOIC-8 SPI PSRAM kullanılıyor
- ISSI, APMEMORY, Vilsion gibi şirketler ilgili parçaları üretiyor; 8 MB parçalar genel dağıtım kanallarından temin edilebiliyor
- 16 MB çipler birkaç üretici tarafından vaat edilmiş olsa da fiilen tedarik edilmediği değerlendirildi
- Mikrodenetleyici olarak PIC16F, RL78, PSoC1, eZ8, S08CPUv2, STM8, MSP430, AVR, PSoC4, MSPM0C, CH32V003, CH570E ve STM32G0 aileleri karşılaştırıldı
- Nihai seçim STM32G031J4M6/STM32G031 ailesi oldu
- Cortex-M0+ çekirdeği, resmi 64 MHz, 32 KB flash ve 8 KB RAM sunuyor
- 8 pinli pakette performans ve bellek açısından diğer adaylardan avantajlıydı
- STM çiplerinin errata belgesi kalitesi endişe yaratsa da tasarım, çip üzerindeki çevre birimlerini minimum düzeyde kullandığı için seçilebilir bulundu
6 I/O pini içine sığdırılan donanım tasarımı
-
Konsol UART
- UART RX ve TX’i diğer işlevlerle birleştirmek zor
- RX paylaşılırsa başka işlemler sırasında gelen veriler kaçırılabilir; TX paylaşılırsa kısa low darbeleri bile PC’de karakter gibi görünebilir
- Bu nedenle 6 I/O’dan 2’si UART konsoluna ayrıldı
- Nihai pin yerleşiminde pin 8 USART2 RX olarak kullanılıyor, pin 7 ise UART TX’i bit banging ile yapıyor
- UART gönderimi sırasında tüm yürütme durduğu için mümkün olan hızlı değer olan 115.200 bps kullanılıyor
- Tek karakter gönderimi yaklaşık 87 mikrosaniye sürüyor; kart çoğu zaman çıktı vermediğinden bu yöntem kabul edilebilir
-
RAM bağlantısı
- SPI PSRAM QSPI destekliyor, ancak QSPI için 6 pin gerektiğinden kullanılamıyor
- dual-SPI, ek pin kullanmadan normal SPI’dan 2 kat hızlı olabilir; ancak STM32G031 dual-SPI desteklemiyor
- CPU ile dual-SPI’ı bit banging yapmak da donanım SPI ve DMA birleşimini geçmekte zor görülüyor
- Sonuç olarak RAM normal SPI ile bağlanıyor ve bu bağlantı tek başına kalan 4 pinin tamamını kullanıyor
-
SD kart bağlantısı
- SD kartı SPI modunda kullanmak için fazladan bir chip select pini gerekiyor; ancak boş pin yoktu
- RAM nCS’yi inverter ile ters çevirip SD kart nCS olarak kullanma yöntemi bazı kartlarda sorun çıkardı ve ek bileşen de gerektiriyordu
- UART TX pinini alçak geçiren filtreyle birlikte SD card nCS olarak paylaşma yöntemi de değerlendirildi; ancak 300 bps veya daha düşük UART gerektiriyor ve SD kart yavaş olduğunda kırılgandı
- Nihai çözüm, SD kartın 1-bit SDIO protokolünü doğrudan uygulamak oldu
- RAM nCS SD CLK, RAM CLK SD CMD, RAM MOSI ise SD DAT olarak paylaşılıyor
- RAM erişimi SD kart tarafından idle durumundaki 1 bit gibi, SD erişimi ise RAM tarafından yalnızca seçme ve bırakmanın tekrarlanması gibi göründüğü için güvenli çalışıyor
- Ancak SD transaction ortasında RAM erişimi araya giremediğinden çok bloklu okuma/yazma kullanılamıyor
- STM32G031 pin yerleşimi nedeniyle SDIO donanım birimi olarak kullanılamadığından tüm SD erişimi bit banging ile yapılıyor
- Assembly uygulaması yaklaşık 14 CPU cycles/bit verim sağlıyor
Bootloader ve Linux önyükleme akışı
-
Emülatör
- Mevcut LinuxCard projesindeki MIPS emülatörü yeniden kullanıldı
- Emülatör ARMv6M assembly ile yazılmıştı ve Linux’u başlatabiliyordu
- Daha hızlı çalıştırma için MIPS-to-ARMv6M JIT de yazıldı; ancak kod boyutu 46 KB olduğu için çok büyüktü ve 6 KB dönüştürme önbelleğinde hız kazancı da yeterli olmadığından kullanılmadı
- STM32G031’in 32 KB flash’ı 8 KB bootloader ve 24 KB ana kod olarak ayrılıyor
-
Firmware güncellemesi için bootloader
- Debug pinleri bırakılamadığı için SD karttan firmware güncelleyen bir bootloader gerekiyordu
- Bootloader içinde SDIO sürücüsü, FAT dosya sistemi sürücüsü, flash yazma kodu, loglama ve bit banging UART gönderim kodu yer alıyor
- Gerçek boyutu yaklaşık 6,5 KB, ancak flash blok birimi nedeniyle 8 KB alan kullanıyor
- SD kartta FIRMWARE.BIN aranıyor; temel kontrollerden geçerse ve sürüm artışı koşulunu karşılarsa güncelleme uygulanıyor
- Uygulama imajında offset 16’daki word sürüm numarası olarak kullanılıyor
- Bootloader offset 8’deki byte bootloader sürümüdür; ana uygulama açılış metnini göstermek dışında kullanılmıyor
- Bootloader, FAT dosya sisteminde adı CLOCK ile başlayan dosya veya dizinleri de arıyor
- Ardından gelen sayı ana uygulamanın clock hızı olarak kullanılıyor; 32–200 MHz aralığı dışındaysa veya değer yoksa 132 MHz kullanılıyor
-
Kart bölümleri ve kernel yükleme
- Önyükleme akışı PC açılış sürecine benzer şekilde oluşturuldu
- SD kartın ilk sektörü RAM başlangıç kısmına okunup oraya atlanıyor
- İlk aşama kodu type 0xBB partition’ı bulup 0x80001000 adresine yüklüyor ve oraya atlıyor
- İkinci aşama bootloader, active olarak işaretlenmiş partition’ı FAT16 olarak mount ediyor ve VMLINUX dosyasını ELF olarak yüklüyor
- Kernel komut satırı bootloader’a gömülü
- root
/dev/pvd3, init ise/sbin/uMIPSinit /dev/pvd1,/bootolarak mount edilmeye çalışılıyor- Projenin partition sırası FAT partition, bootloader partition, rootfs şeklinde
- Windows ve macOS ilk partition’ı mount ettiğinden FAT partition üzerinden dosyaları kolayca içeri-dışarı taşımak mümkün
- Başlatılan Linux’ta da bu partition
/bootolarak görünüyor
Performans ve overclock
- STM32G031’in resmi çalışma hızı 64 MHz olsa da dahili voltaj ayarı kullanılarak daha yüksek clock denendi
- STM belgelerinde VOS2 1,0 V ve VOS1 1,2 V ayarları var; VOS1’de yaklaşık 75 MHz üzeri kararlı değil
- Eski belgelerde ve benzer çip belgelerinde görülen VOS0 1,35 V ayarı kullanıldığında overclock alanı ciddi biçimde artıyor
- Çiplerin çoğu 136 MHz’de iyi çalışıyor, bazıları 180 MHz’e kadar çıkıyor
- Flash bellek hızlanmadığı için flash wait states doğru yönetilmeli
- 148 MHz host CPU’da emüle edilen MIPS CPU, FPU devre dışıyken yaklaşık 1,65 MHz MIPS R3000’e benziyor
- Sistem yaklaşık 1 dakika içinde açılıyor; vi, make, objdump ve gcc çalışıyor
- Tam bir Debian sistemi olduğundan
.debpaketleri/bootüzerinden getirilip kurulabiliyor
Montaj ve ilk çalıştırma
-
Montaj akışı
- Kartın doğrudan üretilebilmesi için tasarım dosyaları sağlanıyor ve kit satışı yapacak şirket aranıyor
- Montaj SD kart soketi, kapasitör, direnç, STM32G031, PL2303GL sırasıyla yapılıyor
- R101, R102, R201, R202 başlangıçta doldurulmuyor
- Önce bootloader STM32’ye yazılmalı
- R101 ve R201 köprülenerek ROM bootloader için seri kablolama yapılandırılıyor
- SD kart takılı değilken ve RAM çipi de henüz lehimlenmemişken işlem yapılıyor
- Bootloader yazıldıktan sonra R101/R201 köprüsü kaldırılıyor ve R102/R202 köprüleniyor
- Ardından APS6408 veya VTI7064 RAM çipi U2 konumuna lehimlenince donanım montajı tamamlanıyor
-
Firmware ve ilk açılış
- SD kart en az 1 GB olmalı ve sağlanan disk imajı yazılmalı
- İmajda 1. aşama MIPS bootloader, 2. aşama MIPS bootloader, Linux kernel ve firmware kopyası içeren partition ile Debian rootfs bulunuyor
- FAT partition’a FIRMWARE.BIN konduğunda ilk açılışta bootloader kendini flash’lıyor
- Seri terminal 115.200 bps, 8N1 olarak ayarlanıyor
- İlk çalıştırmada STM32 fuse programlanır; USB-C kablosunu çıkarıp yeniden takmak gerekebilir
- Yaklaşık 20 saniye sonra Linux kernel açılış mesajları başlar; tam açılış yaklaşık 1 dakika sürer
- Yalnızca 8 MB RAM olduğu için ilk komut olarak
swapon /swapfileçalıştırılması kuvvetle önerilir - swap etkinleştirme onlarca saniye sürer, ancak sonrasında daha fazla program çalıştırılabilir
İndirme dosyaları ve kullanım
- Ana indirme uMIPS.8PL.zip
- Arşiv, kart üretimi ve çalıştırma için gereken dosyaları içeriyor
schematics: devre şemalarıgerbers: kart üretimi için Gerber dosyalarısrcs: emülatör ve bootloader kaynaklarıbinaries/SD.img: SD karta yazılacak imajBOOTLOADER.BIN: montaj sırasında çipe yazılacak bootloaderFIRMWARE.BIN: önceden derlenmiş firmware imajı
- Açılıştan sonra varsayılan shell
sh;bashde çalıştırılabiliyor - RAM yetersizliğinden kaçınmak için imajda bulunan swapfile’ı
swapon /swapfileile etkinleştirmek iyi olur - MCU’nun 120 MHz’de çalıştığı varsayılırsa efektif CPU hızı yaklaşık 1,5 MHz
- Basit bir C programını gcc ile derlemek birkaç dakika sürüyor, ama çalışıyor
- Örnek olarak kayan noktalı ve sabit noktalı Mandelbrot üreteçleri kaynak ve binary biçiminde sağlanıyor
- Kurulu araçlar arasında vim, make ve gcc bulunuyor; Debian paketleri SD karttaki paylaşımlı FAT16 partition üzerinden eklenebilir
1 yorum
Hacker News yorumları
Hangi pinlerin SDIO'nun üç piniyle birleştirilebileceğini düşündükten sonra RAM'in nCS pinini SD kartın CLK'si, RAM'in CLK pinini SD kartın CMD'si, RAM'in MOSI pinini de SD kartın DAT pini olarak kullanma çözümüne varılması gerçekten harika bir hack
Her aygıtla olası etkileşimleri tek tek değerlendirince güvenli çalıştığının da ikna edici olması, bunu Hacker News'e fazlasıyla layık kılıyor
USB'ye bağlanmak için ayrı bir çip kullanmanın varsayılan seçenek hâline gelmesini görmek bana hep biraz üzücü geliyor
USB çok karmaşık bir protokol; düşük hızlı USB 1.1 çalıştıran temel V-USB seviyesinin ötesine geçince, özel donanım ve epey büyük bir yazılım yığını olmadan genelde zor görünüyor
Buna karşılık SPI inanılmaz derecede basit; gereken asgari donanım, yeterince hızlı clock alabilen bir shift register kadar
Eski masaüstü ve dizüstülerde olduğu gibi dışarıya açık seri/paralel portların bulunup bu tür düşük seviye iletişimin yapılabildiği günleri özlüyorum
Basit çevre birimleri UART, I2C, SPI multidrop'u kısa mesafede birkaç standart clock ve tek bir konnektörle kullansaydı; monitör veya harici disk gibi veri yoğun aygıtlar da doğrudan IEEE 802.3 Ethernet'e geçseydi, belki USB ve Ethernet'i ayrı ayrı desteklemek yerine yalnızca Ethernet linkini desteklemek yeterli olurdu
SPI, USB'nin sunduğu güç sağlama, hot-plug, aygıt keşfi, bit hataları gibi birçok kullanışlı özelliği hesaba katmaz
Yazılım geliştiricilerin SPI idiomlarını ve donanım tasarımcılarının SPI'ı nasıl kullandığını anlamasında değer var
SPI genellikle çevre birimlerinin register'larını doldurmak için kullanılır; USB veya Ethernet'te ve onların üzerindeki soyutlama katmanlarında sık görülen üst seviye asenkron iletişimden farklı bir karaktere sahiptir
SPI frame'leri için evrensel bir standart yok ama yerleşik örüntüler var ve sayısız uygulamada bu kadarı yeterli oldu
Gerçekçi bakınca SPI ve I2C gibi basit protokoller yeterli değil
Hızlı değiller, single-ended sinyalleme kullandıkları için gürültüye çok duyarlılar ve hata düzeltmeleri de yok
Bu protokoller amaçlanan kullanım için, yani PCB üzerindeki IC'leri birbirine bağlamak için çok uygundur; ancak sonlandırma olmadan portu dışarıya açarsanız hiçbir şeyi garanti etmek zordur
Modern PC'lerde de bu protokoller ve türevleri çokça kullanılır, ama nihayetinde bunlar dahili bus'lardır
USB spesifikasyonuna ayrıntılı bakmadım ama bit-banging'in başlıca sorunu muhtemelen gereken hızdır
Mikrodenetleyici pinleri toggle ederken aynı anda protokolü çözümleyecek ve hata düzeltmeyi yönetecek kadar hızlı olmadığından özel donanım gerekir
I2C'yi bit-banging ile çalıştırırken de aynı sorunla karşılaşabilirsiniz
20MHz CPU ile elde edilebilecek maksimum clock yaklaşık 250KHz'dir; bu, tipik maksimum hız olan 400KHz'in biraz üzerinde yarısı kadardır ve 1MHz sürümü fiilen imkânsızdır
PHY'lerin var olma nedeni, iletişim protokolünü donanıma devretmenin ezici biçimde daha ucuz olmasıdır
Aksi hâlde iletişimi elle yönetmeye kaynak ayırmak için CPU'yu çok daha fazla abartmanız gerekir; bu yüzden modern mikrodenetleyicilerde I2C, SPI ve seri iletişim donanımı bulunur
Sonuç olarak SPI, I2C, UART gibi basit seri protokoller harici çevre birimleri için çok kötü seçimlerdir
Uygun hızlarda çalışmaları zordur, uzun kablolara ve gürültüye dayanamazlar
RS-232 bir UART olmadığı için onu istisna saysak bile, bu protokollerin doğası ve tasarımı gereği bu şekilde kullanılamazlar; bunu destekleyecek şekilde spesifikasyonu değiştirmeye kalkarsanız sonunda USB'yi yeniden icat etmiş olursunuz
Dijital tabela ya da toplantı odası TV ekranları da HDMI-CEC'ten daha esnek kontrol için çoğu zaman RS-232 sunuyor
Çoğu durumda 9600bps'den yüksek bit hızına gerek yok ve en yaygın konnektör Tx, Rx, GND'den oluşan 3 pinli vidalı terminal
Günümüz kurulumlarında genellikle bir yerlerde en az bir RS232-USB adaptörü bulunuyor; büyük odalarda ise RS232 Ethernet üzerinden köprüleniyor
Bu alana ilk girdiğimde şaşırmıştım, ama birçok kurulumun onlarca yıllık olduğunu ve bileşenlerin tek tek değiştirildiğini düşününce anlaşılır geliyor
Bu çip yaklaşık 0,10 dolar seviyesinde; 2KB RAM, 16KB Flash, 48MHz ve 1 CPI ile çalışıyor
Yeni CH570 de SOIC8 paketinde yaklaşık 0,10 dolar seviyesinde; 100MHz, 16KB RAM, 256KB Flash, USB ve 2.4GHz paket radyosu bile var, geliştirme kartını sipariş ettim
Kendi kartını yapmak isteyenler için gereken PCB kalınlığını da belirtmek iyi olurdu
Yanlış hatırlamıyorsam yaklaşık 0,8mm ve “USB-C edge connector”ın fişe uyması için bu kalınlık gerekiyor
Harika bir yazı, ama 8 pin şartı biraz daha esnek ele alınsaydı çok daha basit olur muydu diye merak ediyorum
Sadece birkaç pin daha olsa proje karmaşıklığı ciddi biçimde azalır, lehimleme süresi de yalnızca çok az artardı gibi geliyor
Dahili USB'si olan çok daha hızlı çipler çok
Allwinner V3s de elle lehimlenebilir, RAM'i dahili ve Linux'u native olarak gayet iyi boot eder
RP2350 de iyi bir seçenek; dahili cache'e sahip harika bir QSPI RAM arayüzü ve USB desteği var
Neredeyse 2 çipli bir projeye yakın
Biri yalnızca USB-seri IC; SD kartı saymasaydık, SD kartla birlikte yine 3’e çıkıyor
Toplam pin sayısı o kadar az ki dead bug yöntemiyle yapmayı denemek geliyor insanın içinden
microSD-to-SD adaptörü, lehimlenebilir bir microSD tutucu olarak oldukça işe yarar
Ona yönelik benzer bir numara yapmak da eğlenceli bir hack olabilir
Teknik olarak çok havalı bir proje, ama yeni başlayanlara yönelik yeni bir bilgisayar kiti yapma hedefinden biraz sapacak kadar uç noktaya gitmiş gibi
Yeni başlayan biri için SOIC8 lehimlemekle SOIC28 lehimlemek arasında büyük fark yok
SOIC28 de SOIC8 kadar kolay ya da zor sayılır
Daha büyük bir çip kullanılırsa asgari düzeyde ses, klavye ve ileride VGA tarzı gerçek monitör çıkışı bile eklenebilir; böylece çok daha kullanışlı bir bilgisayar olabilir
Lehimleme zorluğu neredeyse artmadan, ilgisi oluşan kullanıcıların genişletmesi için iyi bir temel olur
Böyle bir yönde yapmak istiyorsanız kodumu kullanabilirsiniz
Ben 8 pinlik yapay kısıt hoşuma gittiği için böyle yaptım
Kartı bile atlayıp bunu bir devre heykeli olarak yapma yönünde garip bir dürtü oluşuyor
Ben sanatçı ya da heykeltıraş olmadığım için buna cesaret edemedim
Depolama için SD kart yerine 8 pinli SPI Flash kullanmak sevimli olurdu
“Kişisel nedenlerle RISC-V’ye alerjim var” demiş; nedeni merak ediliyor
Alevli bir tartışma başlatmak istemiyorum; bu sadece kişisel görüşüm, ama oldukça güçlü bir görüş
RISC-V tarihsel olarak yeterince geç tasarlandı ve mevcut birikimin büyük kısmından yararlanabilirdi; bence bunu neredeyse hiç yapmadı
Bu yüzden en baştan düzgün yapılması gereken şeyleri düzeltmek için çeşitli uzantılar öneriliyor
Eklemeler arttıkça, ancak 10 yıl sonra yavaş yavaş mantıklı bir biçime yaklaşmaya başladı
Bir öğrenme süreci gerektiği bahanesini de kabul etmiyorum
Gerekli bilgiler en baştan vardı ve hatalar çoğumuz için açıktı
Bazı uzantılar, temel tasarım sorunlarının üzerine yapıştırılan yara bandından ibaret
Örneğin shadd2, dizi erişimi için doğru düzgün adresleme modu olmaması sorununu yamayan bir yara bandı
Buna verilen yaygın cevap, çekirdek içinde sihirli komut füzyonu vaat etmek; sık sık vaat ediliyor ama gerçekte sunulmuyor
Özellikle de RISC-V’nin tek hedefi gibi görünen düşük maliyetli işlemcilerde hiç sunulmuyor
Bit alanı çıkarma ve ekleme komutlarının olmaması da amatörce bir hata; bunu düzelten bir uzantı da var
Ama böyle bir özelliğe ihtiyaç olduğu en baştan açık olmalıydı
Bir kayıttaki belirli bir bite göre koşullu dallanma yapan komutlar da yaygın olduğu için, en baştan düşünülmesi gereken bariz bir özellikti
Modern yazılım biraz analiz edilse bile ortaya çıkardı
Can sıkıcı olan, bilginin zaten mevcut olması
Modern yazılımın neler yaptığını biliyorlardı ama hepsi görmezden gelindi; sonuçta biraz güncellenmiş bir MIPS-1 aldığımızı düşünüyorum
Şimdi üzerine bir sürü uzantı eklendi ve parçalanma ciddi boyuta ulaştı
Bir ölçüde makul nihai sonuç olan RV23 gibi bir şeyi hedefleyebilirsiniz, ama bunu uygulayan donanım yok; ya da her yerde çalışan ama berbat performans gösteren en küçük ortak paydayı hedeflemek zorundasınız
RISC-V’yi gerçek yüksek performanslı bilişim için kullanmaya çalıştığınızda daha ciddi tasarım sorunları da var, ama onu bir sonraki rant’e bırakıyorum
Benzer dönemde tasarlanan başka bir komut kümesi, modern yazılımın nasıl göründüğüne dair bilgiyi gerçekten kullandı ve sonuç ortada: aarch64
Projenin kendisi de çok havalı, ama bu sayfa küçük mikrodenetleyiciler hakkında bilgi edinmek için de harika bir kaynak
WLCSP ailesi eksik, ancak ARM için MIPS emülatörü sayfasına https://dmitry.gr/?r=05.Projects&proj=33.%20LinuxCard da uzanıyor; oldukça ilginç görünüyor