Anakarta CH341a ile BIOS nasıl yazılır?

Katılım
21 Aralık 2023
Mesajlar
2.598
Çözümler
8
Beğeniler
2.464
Yer
Kaer Morhen
Anakartıma BIOS yazacağım ancak programda çipin modelini bulamadım. 1.8v adaptörü henüz kargodan gelmediği için anakarta takmayacağım.

Mevcut çip görselini bırakıyorum, ayrıca bu işlemi nasıl yapacağımı anlatırsanız sevinirim. @deadfellow

 

ServisPoint'e verdim ama tahminimce dediğiniz gibi oldu. Kartta hiçbir sorun yok. Bilgi için teşekkürler.
 
Konuya geç baktım. Benim de bu işle HDD BIOS'unu aynı cihazla yazınca alakam oldu; epey deneyimim olmuştu ama işte yoksa çip neye yarar yine de bakardık iyice. Hayırlı olur inşaallah.
 
Bu arada CH341A çipini üreten firma CH347 adında üst modelini çıkarmış.
SPI saat hızı 60MHz'e kadar destekliyor. BIOS'ları daha hızlı yazacak artık.
SWD ve JTAG desteği gelmiş. Özellikle mikrodenetleyici programlama ve debug işleri yapanların işine yarayabilir.

İç karartan siyah PCB yerine mor PCB'ye geçmişler. CH341A'da olan çiplere 5V gitmesine sebep olan tasarım hatası düzeltilmiş.

 

Keşke yeni nesil çiplere uygun aparat ekleseler.
 
Konuda bahsi geçen WSON kılıf çiplerin bacakları altta olduğundan dışarıdan aparatla bağlantı yapmak mümkün değil. Ya SPI header kullanılacak ya da çip sökülecek.
 
Konuda bahsi geçen wson kılıf çiplerin bacakları altta olduğundan dışarıdan aparatla bağlantı yapmak mümkün değil. Ya spı header kullanılacak ya da çip sökülecek.

Ben dışarıda bağlantı gördüğümden ve aynı boyutlarda aparat gördüğümden mümkün olduğunu düşünmüştüm. MSI forumda ise bunun mümkün hatta denendiğini yazmışlardı.
 
Ben dışarıda bağlantı gördüğümden ve aynı boyutlarda aparat gördüğümden mümkün olduğunu düşünmüştüm. MSI forumda ise bunun mümkün hatta denendiğini yazmışlardı.
Aliexpress sitesinde bir tanesini gördüm. WSON kılıfın yapısından ötürü SOIC'lerdeki gibi çipin üzerinde kendi kendine durabilen bir çözüm biraz zor. İnce pogo pinlerle bir aparat yapmışlar. PCB üzerindeki çipin padlerinin dışarı taşan kısımlarına denk gelecek şekilde bastırılarak kullanılıyor.

 

Benim gördüğüm kılıf misali çipi tamamen üstüne oturup el ile sabit tutmaya gerek kalmayan türdendi. Bu da fena değil yine de.
 
Birçok flash çiplerinde çıkış gücü en düşük seviye olan %25'e ayarlanmıştır. Bu durum mandal ya da SPI header ile yapılan okumalarda kablodan kaynaklı kapasitans, sinyal zayıflaması ve SCK hattının oluşturduğu crosstalk nedeniyle hatalara neden olabilmektedir. Bu nedenle bazen çipin çıkış gücünü artırmak gerekebilmektedir. Bunun için bir script yazdım. Script önce Status Register-3'ü okur. Ardından 0x9F ile maskeleme yaparak 6. ve 7. bitleri temizler. Ardından bu bitlere seçtiğimiz çıkış gücüne uygun değerleri yazarak Flash'a gönderir. Güvenlik nedeniyle geçici yazma komutu kullanılmıştır. Çipin enerjisi kesildiğinde işlemden önceki eski ayarlarına geri döner.

(Normalde AsProgrammer ve NeoProgrammer içerisinden status register'lara erişip değişiklik yapabilirsiniz. Ancak bu yazılımların dahili işlevleri kalıcı yazma komutu ile işlem yapıyor. İşlem kalıcı olduğu için geri alamama riski var. Bu nedenle özel script yazdım. )

Bu kodu kopyalayıp asporogrammer'in scripts klasörü içerisine .pas uzantısı ile kaydedin. Ardından Asprogrammer içerisinden script editörü açın. File > Open menüsünden kaydettiğiniz script dosyasını seçin. Section menüsünden ayarlamak istediğiniz çıkış gücünü seçip, Execute'e tıklayın. Ardından script editörü kapatın. Ardından araç çubuğundaki Read SREG düğmesi ile status register'ları okuyarak kontrol sağlayabilirsiniz. Status Register-3'te:
%100 için X00xxxxx,
%75 için X01xxxxx,
%50 için X10xxxxx,
%25 için X11xxxxx değeri görmeniz lazım.
X'ler çipin mevcut ayarlarına göre değişiklik gösterebilir, 0'a da 1 olabilir.

Kod:
{$100}
begin.
 if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
 sreg := 0;
 SPIWrite(0, 1, $15);
 SPIRead(1, 1,sreg);

 sreg_temp := (sreg and $9F) or $00;

 SPIWrite(1, 1, $50);
 SPIWrite(1, 2, $11,sreg_temp);
 //Busy?
 repeat.
 SPIWrite(0, 1, $05);
 SPIRead(1, 1, sreg);
 until((sreg and 1) <> 1);
 ProgressBar(1);

 ProgressBar(0, 0, 0);
 SPIExitProgMode();

end.

{$75}
begin.
 if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
 sreg := 0;
 SPIWrite(0, 1, $15);
 SPIRead(1, 1,sreg);

 sreg_temp := (sreg and $9F) or $20;

 SPIWrite(1, 1, $50);
 SPIWrite(1, 2, $11,sreg_temp);
 //Busy?
 repeat.
 SPIWrite(0, 1, $05);
 SPIRead(1, 1, sreg);
 until((sreg and 1) <> 1);
 ProgressBar(1);

 ProgressBar(0, 0, 0);
 SPIExitProgMode();

end.

{$50}
begin.
 if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
 sreg := 0;
 SPIWrite(0, 1, $15);
 SPIRead(1, 1,sreg);

 sreg_temp := (sreg and $9F) or $40;

 SPIWrite(1, 1, $50);
 SPIWrite(1, 2, $11,sreg_temp);
 //Busy?
 repeat.
 SPIWrite(0, 1, $05);
 SPIRead(1, 1, sreg);
 until((sreg and 1) <> 1);
 ProgressBar(1);

 ProgressBar(0, 0, 0);
 SPIExitProgMode();

end.

{$25}
begin.
 if not SPIEnterProgMode(_SPI_SPEED_MAX) then LogPrint('Error setting SPI speed');
 sreg := 0;
 SPIWrite(0, 1, $15);
 SPIRead(1, 1,sreg);

 sreg_temp := (sreg and $9F) or $60;

 SPIWrite(1, 1, $50);
 SPIWrite(1, 2, $11,sreg_temp);
 //Busy?
 repeat.
 SPIWrite(0, 1, $05);
 SPIRead(1, 1, sreg);
 until((sreg and 1) <> 1);
 ProgressBar(1);

 ProgressBar(0, 0, 0);
 SPIExitProgMode();

end
 
Son düzenleme:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…